Existen 2 objetos en principal: A a,b;
, un objetivo en el cuerpo de la función f()
: A b;
y luego hay objeto temporal que se está copiando y su copia está almacenada en b
.
Al regresar b
en el cuerpo de su función, la copia se crea en un primer momento, entonces el local de b
se destruye, luego copia se asigna a la variable declarada en b
principal y luego se destruye esta copia.
Agregue la línea siguiente a la clase A
definición y verse a sí mismo:
A(const A&) { cout << "copying" << endl; }
Con Named Return Value Optimization, el compilador trata de eliminar redundante constructor de copia y Destructor llama lo que significa que los entes locales b
de la función f()
se le asignará en la variable b
en main sin crear una copia. Entonces con RVO/NRVO solo se crean 3 objetos en su caso.
Aunque hay una manera de cómo evitar la autodestrucción esta copia sin RVO en su caso:
A a;
A b = a.f();
en este caso copia del valor de retorno de la función f()
se crea y se almacena como una variable b
. Lo que también significa que no se llama a ningún operador de asignación y solo se crean 2 objetos en main: a
y copia de b
devuelto por f()
.
Espero que esto ayude.
No, no es así. http://ideone.com/ywGdo –
¡Uy! Usé Codepad .. http://codepad.org/1OJGoYGP – Venky
No etiquetes tus preguntas con "c" cuando se trata de C++. Los idiomas no son lo mismo. – tinman