Рассмотрим класс, копии которого необходимо сделать. Подавляющее большинство элементов данных в копии должны строго отражать оригинал, однако есть несколько выбранных элементов, состояние которых не должно быть сохранено и нуждается в повторной инициализации .
Это плохая форма вызова оператора присваивания по умолчанию из конструктора копирования?
Оператор присваивания по умолчанию будет хорошо работать с Plain Old Data (int, double, char, short), а также с классами, определенными пользователем, для их операторов присваивания. Указатели должны обрабатываться отдельно.
Один недостаток заключается в том, что этот метод делает оператор присваивания искалеченным, поскольку дополнительная повторная инициализация не выполняется. Также невозможно отключить использование оператора присваивания, открывая, таким образом, возможность пользователю создавать поврежденный класс с помощью неполного оператора присваивания по умолчанию A obj1,obj2; obj2=obj1; /* Could result is an incorrectly initialized obj2 */
.
Было бы хорошо смягчить требование, чтобы в a(orig.a),b(orig.b)...
помимо a(0),b(0) ...
было написано. Необходимость писать всю инициализацию дважды создает два места для ошибок, и если новые переменные (скажем, double x,y,z
) должны были быть добавлены в класс, код инициализации должен был бы быть правильно добавлен как минимум в 2 местах вместо 1.
Есть ли лучший способ?
Есть ли лучший способ в 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);
Выход:
X: 123 456 789 987
Y: 123 456 0 987
Альтернативный конструктор копирования:
A(const A & orig):a(orig.a),b(orig.b),c(0),d(orig.d){} /* <-- is this "better"? */