考虑需要复制的一类。副本中的绝大多数数据元素必须严格反映原始数据,但只有少数元素的状态不需要保留,需要重新初始化。
从复制构造函数调用默认赋值运算符是不好的形式吗?
默认赋值运算符将与普通旧数据(int、double、char、short)以及用户定义的每个赋值运算符的类一起表现良好。指针需要单独处理。
一个缺点是,由于没有执行额外的重新初始化,这种方法使赋值运算符失效。也不可能禁用赋值运算符,从而打开用户使用不完整的默认赋值运算符创建损坏类的选项A obj1,obj2; obj2=obj1; /* Could result is an incorrectly initialized obj2 */
。
a(orig.a),b(orig.b)...
放宽 to除了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"? */