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:
- 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)
- 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)
- 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)
- 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)
- 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:
- 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)
- 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)
- 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)
- Después de test1 ultima función, el objeto se libera t1, t1 realiza destructor
conclusión
- En la plataforma Linux, se produce una menor objetos anónimos, mejorar la eficiencia
- 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