2012-09-27 8 views
5

Y, de forma similar, ¿el constructor de copia predeterminado llama al constructor de copia en todos los miembros? Por ejemplo, si una clase tiene un miembro no-POD de este modo:¿El operador de asignación predeterminado llama a operator = en todos los miembros?

class A 
{ 
    std::string str; 
}; 

... será el constructor de copia generado por el compilador por defecto y el trabajo operador de asignación correctamente? ¿Llamarán al constructor de copia de la cadena y al operator= o simplemente harán una copia bit a bit de la variable miembro str?

En otras palabras, ¿tener un miembro std::string significa que esta clase necesita un constructor de copia y un operador de asignación implementados por el usuario?

Respuesta

5

Sí, el generado por el compilador funcionará correctamente.

Sin embargo, si implementa los suyos y los deja vacíos, no lo hará.

Si no administra la memoria y todos sus miembros proporcionan copia/asignación/destrucción correctas, no necesita (y no debe) implementar su propio constructor de copia/destructor/operador de asignación.

En otras palabras, ¿tener un miembro std :: string significa que esta clase necesita un constructor de copias y un operador de asignación implementados por el usuario?

No, los generados por el compilador funcionarán perfectamente.

+0

"Sí, el generado por el compilador funcionará correctamente". - incluso para las clases con miembros const? –

+0

@spin_eight, entonces una copia o asignación ni siquiera compilaría. –

+3

@LuchianGrigore: en realidad, se compilará una copia. La asignación obviamente no. –

Cuestiones relacionadas