que - ¿Se llama Copiar constructor en C++ cuando se devuelve un objeto desde una función?
herencia c++ (5)
Entiendo que se llama copia al constructor en tres instancias
- Cuando se crea una instancia de un objeto y se inicializa con valores de otro objeto.
- Al pasar un objeto por valor.
3. Cuando un objeto es devuelto desde una función por valor.
Tengo una pregunta con no.3 si se llama al constructor de copia cuando se devuelve un valor de objeto, ¿no debería crear problemas si el objeto se declara localmente en la función?
Me refiero a que el constructor de copia es una copia profunda y toma la referencia de un objeto como parámetro
De acuerdo con una respuesta a mi pregunta, el constructor de copia puede llamarse incluso dos veces: una vez para copiar un objeto local en el ''objeto'' de devolución, y una vez para copiar el objeto de devolución en la variable a la que fue asignado.
Sin embargo, no tiene por qué ser! El compilador puede optimizar ambas construcciones de copia de distancia.
Hay tres casos generales donde se llama el constructor de copia:
- Cuando se crea una instancia de un objeto y se inicializa con valores de otro objeto (del mismo tipo).
- Al pasar un objeto por valor.
- Cuando un objeto es devuelto desde una función por valor.
La copia se realiza antes de que la función llamada salga y copia la variable local existente en el valor de retorno.
La función llamada tiene acceso a la memoria que ocupará el valor de retorno, aunque esa memoria no está "dentro del alcance" cuando se realiza la copia, todavía está disponible.
No, lo llama antes de que los locales sean destruidos. Puede probar esto con un objeto que registre la destrucción y la construcción de la copia, o mirando el código de ensamblaje generado.
Se llama exactamente para evitar problemas. Un nuevo objeto que sirve como resultado se inicializa desde el objeto definido localmente, luego el objeto definido localmente se destruye.
En el caso de un constructor definido por el usuario y copia profunda, todo es lo mismo. El primer almacenamiento se asigna para el objeto que servirá como resultado, luego se llama al constructor de copia. Utiliza la referencia pasada para acceder al objeto definido localmente y copiar lo que sea necesario para el nuevo objeto.