【发布时间】:2010-12-04 18:13:25
【问题描述】:
考虑一个需要复制的类。副本中的绝大多数数据元素必须严格反映原始数据,但是只有少数元素的状态不需要保留,需要重新初始化。
从复制构造函数调用默认赋值运算符是不是不好的形式?
默认的赋值运算符可以很好地处理普通旧数据(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"? */
【问题讨论】:
标签: c++ constructor c++11 copy-constructor assignment-operator