C/Visual C - Devolver objeto

 
Vista:

Devolver objeto

Publicado por Oliver Ramirez (12 intervenciones) el 28/07/2002 06:37:07
Porque cuando devuelvo un objeto por valor se llama al constructor de copia si no se va a copiar ni a igualar nada?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Devolver objeto

Publicado por chuidiang (677 intervenciones) el 28/07/2002 10:05:39
Al devolver un objeto por valor SIEMPRE se hace una copia del mismo. Por ejemplo, si A es una clase

A funcion()
{
A Resultado;
return A;
}

main()
{
funcion();
}

El objeto Resultado es interno a funcion(), con lo que se destruye automáticamente inmediatamente después del return (cuando salimos del ámbito de funcion()). La función main(), por tanto, no lo puede ver en ningún caso. Para que pueda verlo, al hacer return se hace una copia, y main() ve realmente a la copia.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Devolver objeto

Publicado por Oliver Ramirez (12 intervenciones) el 28/07/2002 15:42:06
Ok, se hace una copia, pero A DONDE!!!?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Devolver objeto

Publicado por chuidiang (677 intervenciones) el 29/07/2002 09:55:33
La copia queda "en el aire". No tendrás acceso a ella salvo que hagas algo asi como
main() {
a = funcion();
}

Si haces la llamada a la función sin asignar el resultado...
main() {
funcion();
}

...la copia se ha hecho, pero no tienes ninguna referencia a ella. Se destruirá sola en cuanto salgas del ámbito del main().

Como comprobación a esto, puedes hacer una clase A con un destructor que ponga cout <<"Me han destruido" << endl;

El siguiente programa...
A funcion()
{
A Resultado;
return Resultado;
}

main (){
funcion();
cout << "Voy a acabar el main" << endl;
}

Te dará que se llama dos veces al destructor. Una por la variable Resultado y otra por la copia "fantasma" que te he dicho, justo después del cout del main.

Sé bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Devolver objeto

Publicado por Oliver Ramirez (339 intervenciones) el 29/07/2002 17:26:10
...la copia se ha hecho, pero no tienes ninguna referencia a ella. Se destruirá sola en cuanto salgas del ámbito del main().

en esta parte de lo que me responde, que por sierto esta muy explísito entiendo lo siguiente

habra multiples copias de los objetos que devuelvo a main, lo que quiere dicir que esto me ocupará memoria mientras vida tenga el programa?
si hago 20,000 return por valor de un objeto grande, existirán 20,000 copias fantasma hasta que se destruya el programa?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Devolver objeto

Publicado por chuidiang (677 intervenciones) el 31/07/2002 22:16:05
La copia existe hasta que te salgas del ámbito (de las { ... }) desde las que hicieste la llamda a la función. Lo del main() era por el ejemplo que te puse.
Por ejemplo

for (i=0; i<10000; i++)
{
funcion();
}

Cada llamada a la función devuelve una copia, pero se destruye al empezar la siguiente iteración. Sólo tienes una copia cada vez. Eso sí, estás haciendo y destruyendo copias 10000 veces.

Cada vez que abres una llave se abre un ámbito nuevo que se destruye al cerrar la llave. Todas las variables declaradas entre las llaves y "copias fantasmas" devueltas por las funciónes llamadas dentro de las llaves, se destruyen al salirse de la llave.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar