[C con Clase] Ahora el destructor
Steven Davidson
steven en conclase.net
Mar Jun 19 06:33:34 CEST 2007
Hola Rodolfo,
El pasado 2007-06-19 04:08:59, rodolfo escribió:
r> Hola, saludos a todos.
r> Gracias como siempre a Steven por la aclaración respecto a mi pregunta sobre
r> el constructor de copia. Si, lo que trataba de hacer era una copia profunda,
r> pero no estaba muy seguro de como, ahora si, thanks.
De nada. Me alegro de que vayamos aclarando las cosas.
r> Ahora tengo una duda respecto a los destructores; Tengo una funcion miembro
[CORTE]
r> Cuando reemplazo en el main() las lineas antes mencionadas por estas otras:
r> // verifica el operador sobrecargado +
r> // c1 = mortisaranga, c2 = matachilanga
r> Cadena c33 = c1 + c2;
r> cout << "c33 arroja = " << c33 << "\n";
r> La corrida resulta:
r> Constructor de Conversion: 0x77fda0 - mortisaranga matachilanga
r> c33 arroja = mortisaranga matachilanga
r> Pregunta: ¿a donde se fue el destructor?, si se supone que la cadena
r> temporal en donde se almacenaba c1 + c2 ya hizo su trabajo cuando le
r> fue asignada a c33, ¿porque esa cadena temporal no se destruye?,
r> como si sucedio en el caso anterior, luego de que la cadena temporal
r> fue impresa en pantalla.
Vas por buen camino al suponer este comportamiento. Sin embargo, este objeto temporal es usado en la inicialización de 'c33' y por tanto se invoca el constructor copia. Esto es, la inicialización anterior se podría representar de la siguiente manera:
c33.Cadena( c1.operator+(c2) );
La gran mayoría de los compiladores es un tanto "lista" y se da cuenta de que nos podemos ahorrar crear un objeto temporal. Para el compilador, la secuencia de operaciones viene a ser la siguiente:
Cadena __temp__ = c1 + c2;
Cadena c33 = __temp__;
Como una optimización, elimina ese objeto temporal intermediario ya que decide que en este caso es innecesario mantenerlo puesto que va a ser creado y destruido para luego crear otro objeto. El comportamiento viene a ser que instanciamos un solo objeto: 'c33', en lugar de dos objetos de los cuales uno es temporal y por tanto destruido tan pronto es instanciado.
En resumen, es una "artimaña" para optimizar la ejecución de estas sentencias.
r> Bueno, espero no caer pesado con tanto detalle.
No. Si necesitas detallar, hazlo sin preocupaciones.
Espero haber aclarado la inquietud.
Steven
Más información sobre la lista de distribución Cconclase