[C con Clase] Destrucción automática de objetos temporales

Salvador Pozo salvapozo en gmail.com
Dom Dic 7 18:30:36 CET 2008


> Gracias Salvador. Quería preguntarte qué significa declarar variables
> como haces tú en:
>
> SP>    claseX &t1 = a+b;
> SP>    claseX &t2 = t1+c;
>
> es decir con, el & delante. Ahora mismo no consigo entender qué significa
> desreferenciar al crear una variable.

No se trata de variables, sino de referencias, t1 y t2 son referencias
a objetos de tipo claseX. Puesto que tu operador retorna una
referencia, parece lógico asignar ese valor a una referencia. Lo que
intento es que no se creen nuevos objetos intermedios temporales.

En cuanto a tu problema, creo que Steven tiene razón. Ayer tampoco
analicé a fondo el tema, y pensaba que al retornar un objeto temporal
el compilador usaría el constructor copia para crear un nuevo objeto,
y que la idea era ahorrarnos ese nuevo objeto.

He hecho algunas pruebas, y he verificado que esto no es así (al menos
no con el compilador que uso ahora).

Sin embargo, debes tener cuidado, sobre todo si tus objetos usan
memoria dinámica para algunos datos miembro. Deberías sobrecargar el
operador copia y el de asignación.

Haciendo pruebas he comprobado que ante situaciones aparentemente
similares, el compilador hace cosas diferentes, por ejemplo:

----8<------
   claseX a(1);
   claseX b(2);
   claseX c(4);
   claseX e;

   claseX d = (a+b+c); // 'd' toma el valor del objeto temporal usado
en el operador suma
   d.Visualiza();
   e = a+b+c;   // se usa el operador de asignación para asignar el valor a 'e'
   e.Visualiza();
   claseX f=d;  // se usa el constructor copia para crear el objeto 'f'
   f.Visualiza();
----8<------

En el primer caso no se invoca ni al constructor copia ni se ejecuta
el operador de asignación.

En el segundo caso se usa el operador de asignación para almacenar el
valor de 'e'.

En el tercer caso se invoca directamente al constructor copia.

Hasta pronto.
-- 
Salvador Pozo Coronado
http://www.conclase.net
mailto:salvapozo en gmail.com




Más información sobre la lista de distribución Cconclase