Considere una clase de la cual las copias deben ser hechas. La gran mayoría de los elementos de datos en la copia deben reflejar estrictamente el original, sin embargo, hay algunos elementos seleccionados cuyo estado no se debe conservar y deben reinicializarse.¿Es malo llamar al operador de asignación predeterminado desde el constructor de copia?
¿Es malo llamar a un operador de asignación predeterminado desde el constructor de copia?
El operador de asignación predeterminado se comportará bien con datos antiguos sin formato (int, double, char, short) así como las clases definidas por el usuario para sus operadores de asignación. Los punteros deberían tratarse por separado.
Una desventaja es que este método deja lisiado al operador de asignación ya que no se realiza la reinicialización adicional. Tampoco es posible deshabilitar el uso del operador de asignación abriendo así la opción del usuario para crear una clase interrumpida utilizando el operador de asignación predeterminado incompleto A obj1,obj2; obj2=obj1; /* Could result is an incorrectly initialized obj2 */
.
Sería bueno relajar el requisito de que a a(orig.a),b(orig.b)...
se le debe escribir además a(0),b(0) ...
. Necesidad de escribir toda la inicialización dos veces crea dos lugares en busca de errores y si iban a ser agregado a la clase nuevas variables (digamos double x,y,z
), tendría que añadido correctamente en al menos 2 lugares en vez de 1.
código de inicialización ¿Hay una mejor manera?
¿Hay una manera mejor en C++ 0x?
class A {
public:
A(): a(0),b(0),c(0),d(0)
A(const A & orig){
*this = orig; /* <----- is this "bad"? */
c = int();
}
public:
int a,b,c,d;
};
A X;
X.a = 123;
X.b = 456;
X.c = 789;
X.d = 987;
A Y(X);
printf("X: %d %d %d %d\n",X.a,X.b,X.c,X.d);
printf("Y: %d %d %d %d\n",Y.a,Y.b,Y.c,Y.d);
Salida:
X: 123 456 789 987
Y: 123 456 0 987
Alternativa constructor de copia:
A(const A & orig):a(orig.a),b(orig.b),c(0),d(orig.d){} /* <-- is this "better"? */
ver: http://stackoverflow.com/questions/1457842/is-this-good-code-copy-ctor-operator – sth