Las referencias en C++ me desconciertan. :)C++: devolver por referencia y copiar constructores
La idea básica es que estoy tratando de devolver un objeto desde una función. Me gustaría hacerlo sin devolver un puntero (porque entonces tendría que hacerlo manualmente delete
), y sin llamar al constructor de copias, si es posible (por eficiencia, naturalmente agregado: y también porque me pregunto si no puede evitar escribir un constructor de copia).
Así que, en definitiva, aquí están las opciones para hacer esto que he encontrado:
- El tipo de retorno de la función puede ser o bien la propia clase (
MyClass fun() { ... }
) o una referencia a la clase (MyClass& fun() { ... }
) . - La función puede construir la variable en la línea de retorno (
return MyClass(a,b,c);
) o devolver una variable existente (MyClass x(a,b,c); return x;
). - El código que recibe la variable también puede tener una variable de cualquier tipo: (
MyClass x = fun();
oMyClass& x = fun();
) - El código que recibe la variable puede crear una nueva variable sobre la marcha (
MyClass x = fun();
) o asignarla a una ya existente variables (MyClass x; x = fun();
)
Y algunas ideas al respecto:
- parece ser una mala idea tener el tipo de retorno
MyClass&
debido a que siempre resultan s en la variable que se destruye antes de que se devuelva. - El constructor de copia solo parece involucrarse cuando devuelvo una variable existente. Al devolver una variable construida en la línea de retorno, nunca se llama.
- Cuando asigno el resultado a una variable existente, el destructor también se activa siempre antes de que se devuelva el valor. Además, no se llama a ningún constructor de copia, pero la variable de destino recibe los valores de miembro del objeto devuelto por la función.
Estos resultados son tan inconsistentes que me siento totalmente confundido. Entonces, ¿qué EXACTAMENTE está pasando aquí? ¿Cómo debería construir y devolver correctamente un objeto desde una función?
El motivo por el que no se llama al constructor de copia en el segundo caso se llama optimización de valor de retorno, o RVO. El compilador puede omitir la copia temporal +, incluso si esto cambia el comportamiento del programa. – GManNickG
@ Vilx- ¿Qué tal el regreso a un problema variable existente? Lo he enfrentado pero no pude entender por qué se llama el destructor en un constructor sin copia. ¿Alguna vez has descubierto cuál es la causa de esto? –
@ArthurNunes - Lo siento, no, no he trabajado mucho con C++ y no sé la respuesta. Creo que abandoné este proyecto o lo reescribí de otra manera. (Eso fue hace 5 años, sabes). –