Debe crear su propia copia constructor y operador de asignación (y por lo general constructor por defecto también) cuando:
- desea que el objeto que va a copiar o asignada, o puesto en un contenedor estándar tales como
vector
- El constructor de copia predeterminado y el operador de asignación no harán lo correcto.
Considere el siguiente código:
class A; // defined elsewhere
class B {
private:
A *my_very_own_a;
};
Si deja que el constructor de copia automática de copiar un B
, copiará el valor A *
puntero a través de, por lo que los puntos de copia a la misma A
instancia que el original. Pero parte del diseño de esta clase es que cada B
tiene su propia A
, por lo que el constructor de copias automático ha roto ese contrato. Por lo tanto, debe escribir su propio constructor de copia que creará un nuevo A
para el nuevo B
para señalar.
Sin embargo, tenga en cuenta este caso:
class A; // defined elsewhere
class B {
private:
A *shared_reference_to_a;
};
Aquí cada B
contiene un puntero a un A
, pero el contrato de clase no exige una única A
para cada B
. Entonces, el constructor de copia automática podría hacer lo correcto aquí.
Tenga en cuenta que ambos ejemplos son el mismo código , pero con diferente intención del diseño.
Un ejemplo de la primera situación podría ser B
== cuadro de diálogo, A
== botón. Si crea una copia de un cuadro de diálogo, probablemente también necesite una copia de todos los contenidos.
Un ejemplo del segundo podría ser B
== cuadro de diálogo, A
== referencia al administrador de ventanas. Si copia un cuadro de diálogo, probablemente la copia exista en el mismo administrador de ventanas que el original.
Por lo que yo entiendo (y actuar) - una buena práctica adicional (no retirar las otras respuestas aquí) será seguir "La regla de tres": https://stackoverflow.com/q/4172722/1971003 –