El constructor de copia y el operador de asignación


Si sobrescribo operator= ¿el constructor de copia usará automáticamente el nuevo operador? Del mismo modo, si defino un constructor de copia, ¿operator= 'heredará' automáticamente el comportamiento del constructor de copia?

Author: mpm, 2011-03-20

5 answers

No, son operadores diferentes.

El constructor copy es para crear un nuevo objeto. Copia un objeto existente a un objeto recién construido.El constructor de copia se utiliza para inicializar una nueva instancia desde una antigua instancia. No se llama necesariamente cuando se pasan variables por valor a funciones o como valores devueltos fuera de funciones.

El operador de asignación debe tratar con un objeto ya existente. El operador de asignación se utiliza para cambiar un instancia a tener los mismos valores que el rvalue, lo que significa que la instancia tiene que ser destruido y reinicializado si tiene memoria dinámica interna.

Enlace útil:

 39
Author: Javascript is GOD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:19

No. A menos que defina un ctor de copia, se generará un valor predeterminado (si es necesario). A menos que defina un operador=, se generará un valor predeterminado (si es necesario). No se usan entre sí, y puede cambiarlos de forma independiente.

 11
Author: Erik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-20 11:42:51

No. Son objetos diferentes.

Si su preocupación es la duplicación de código entre el constructor de copia y el operador de asignación, considere el siguiente modismo, llamado copiar e intercambiar :

struct MyClass
{
    MyClass(const MyClass&); // Implement copy logic here
    void swap(MyClass&) throw(); // Implement a lightweight swap here (eg. swap pointers)

    MyClass& operator=(MyClass x)
    {
        x.swap(*this);
        return *this;
    }
};

De esta manera, el operator= utilizará el constructor de copia para construir un nuevo objeto, que se intercambiará con *this y se liberará (con el antiguo this dentro) al salir de la función.

 5
Author: Alexandre C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-20 11:52:46

No, no son el mismo operador.

 1
Author: Jonathan Wood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-20 11:43:21

No.

Y definitivamente echar un vistazo a la regla de tres (o regla de los cinco al tener en cuenta los valores r)

 0
Author: stijn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:58