考慮一個需要製作副本的類。拷貝中的絕大多數數據元素必須嚴格反映原始數據,但是有少數元素的狀態不會被保留,需要重新初始化。從複製構造函數中調用默認賦值運算符是否是錯誤的形式?
從複製構造函數調用默認賦值運算符是否是錯誤的形式?
對於每個賦值運算符,默認賦值運算符對於普通舊數據(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"? */
請參閱:http://stackoverflow.com/questions/1457842/is-this-good-code-copyctor-operator – sth 2009-10-07 19:57:40