C ++ es un problema en el valor de retorno de función (rpm) de un objeto

fuente original: https://www.cnblogs.com/yanhai307/p/10935665.html

 

Enlaces de referencia:

https://www.cnblogs.com/mini-coconut/p/8542560.html

 https://www.cnblogs.com/ysherlock/p/7822287.html

Descripción del problema

En el programa C ++, un valor de retorno de la función es un objeto, devuelve las variables locales dentro de la función en sí,
o producirá un objeto intermedio (objeto anónimo) que?

Después de la prueba, la victoria y Linux plataformas efectos de diferentes

Código es el siguiente

// 
// la Creado por Yanhai EN 28/05/2019.
 //
 #include <iostream la>
 el uso de  espacio de nombres de enfermedades de transmisión sexual; 

clase Test {
 público : 
    la Prueba ( const  char * nombre) 
    { 
        del este -> name = nombre; 
        printf ( " % S : constructor realiza, mi dirección es P% \ n "el nombre, el presente ); 
    } 

    la Prueba ( const la Prueba y obj) 
    { 
        el este -> name = obj.name; 
        printf ( " % S: la realización de un constructor de copia mi dirección es% p, copia de la p-% S% \ n- el ", 
               Name.c_str (), el presente , obj.name.c_str (), y obj); 
    }

     ~ Test () 
    { 
        printf ( " % S: destructor realizar, Mi dirección es P% \ n " , nombre .c_str (), el presente ); 
    } 

pública :
     cadena nombre; 
}; 

la diversión Test () 
{ 
    la Prueba t ( " fui creado en función de la diversión " ); 
    printf ( " en la diversión: el p% \ el n- " , y t );
     de retorno T; 
} 

vacío test1 () 
{ 
    // diversión aquí t1 función dentro de un objeto se crea?
    << cout " Diversión de inicio .. " << endl; 
    la prueba T1 = Diversión (); 
    cout << " Diversión Fin .. " << endl; 
    t1.name = " I fue creado en una función de prueba en " ; 
    printf ( " objeto que se crea en la función de prueba, mi dirección es: P% \ n ' , y T1); 
} 

int main () 
{ 
    COUT << " -------- test1 de inicio .. .----- " << endl; 
    test1 (); 
    cout <<"-------- final test1 ...----- " << endl;
     retorno  0 ; 
}

 

proceso de prueba

En la plataforma de la victoria

El uso de compilación y de ejecución VS2019

El resultado:

Inicio ...----- test1 -------- 
diversión inicio .. 
I fue creado en la diversión en función de: la implementación del constructor, mi dirección es 010FFAC4 
en la diversión: 010FFAC4 
que era función de la diversión creado: la implementación del constructor de copia, mi dirección es 010FFBD4, copia de mí fue creada en función de la diversión 010FFAC4 
que fue creado en función de la diversión: la implementación del destructor, mi dirección es 010FFAC4 
diversión End. . 
mi objetivo es crear en función de prueba, mi dirección es: 010FFBD4 
fui creado en la función de prueba: la implementación del destructor, mi dirección es 010FFBD4 
-------- test1 final. ..-----

  

Explicar el proceso:

  1. En función de la diversión, se crea t objeto, la función de constructor de objeto cabo t (dirección de destino t 010FFAC4)
  2. Cuando se ejecuta la función de la diversión de retorno, genera un objeto anónimo, el objeto ejecuta el constructor de copia anónima, lo que equivale a la aplicación de la prueba tmp = t; (anónimo objetos tmp dirección 010FFBD4)
  3. la función de ejecución divertido extremos, el objeto local variable t se libera, t realizó objeto destructor, función diversión objetos anónimos (TMP) de retorno (dirección de retorno es objeto anónimo 010FFBD4)
  4. En función test1, t1 cuando se crea el objeto con el valor de retorno de la función fun, se convierte en t1 objeto tmp anónima objetos directamente (en lugar de realizar un constructor copia t1, t1 para realizar una prueba de este tipo de prueba = ( "xx") ;) dirección (t1 objeto anónimo es la dirección de objeto 010FFBD4)
  5. Después de test1 ultima función, el objeto se libera t1, t1 realiza destructor

En la plataforma Linux

Utilice g ++ compilador

El resultado:

Inicio ...----- test1 -------- 
diversión inicio .. 
I fue creado en la diversión en función de: la implementación del constructor, mi dirección es 0x7ffe5a2488c0 
en la diversión: 0x7ffe5a2488c0 
divertido Fin .. 
I el objeto se va a crear en función de prueba, mi dirección es: 0x7ffe5a2488c0 
fui creado en la función de prueba: la implementación del destructor, mi dirección es 0x7ffe5a2488c0 
-------- test1 Fin ... -----

 

Explicar el proceso:

  1. En función de la diversión, se crea t objeto, la función de constructor de objeto cabo t (dirección de destino t 0x7ffe5a2488c0)
  2. Al final de la función fun, y ningún objeto anónimo, pero el objeto devuelto t (t 0x7ffe5a2488c0 retorno es la dirección del objeto)
  3. En función test1, objeto t1 utiliza divertido cuando se crea el valor de retorno de la función, que devuelve el objeto se convierte en t t1 objetos directamente (en lugar de realizar un constructor copia t1, t1 para realizar una prueba de este tipo de prueba = ( "xx") ;) dirección (t1 t es el 0x7ffe5a2488c0 objetivo dirección de objeto)
  4. Después de test1 ultima función, el objeto se libera t1, t1 realiza destructor

conclusión

  1. En la plataforma Linux, se produce una menor objetos anónimos, mejorar la eficiencia
  2. Diversión solo dentro de la función original (variables de por vida local) t del objeto, ya que la función de retorno sigue siendo válida test1

Supongo que te gusta

Origin www.cnblogs.com/lh03061238/p/12580907.html
Recomendado
Clasificación