若有如下代码:
AClass a;
AClass b=a;(或AClass b=AClass(a))
则将对象a复制给b,其复制的机制是将a的对象数据成员复制给b,在复制过程中使用了类的复制构造函数。如果在类定义中没指定则编译器为你生成一个默认的,但默认的在某些情况下存在问题(如指针成员)。
int main()
{
AClass i;
i.a = 10;
*(i.b) = 20;
AClass j = i;
*(i.b)=30;
i.a = 20;
cout<<"a="<<i.a<<";b="<<*(i.b)<<endl;
cout<<"a="<<j.a<<";b="<<*(j.b)<<endl;
}
其输出结果将为:
a=20;b=30;
a=10;b=30;
可以发现
i.a = 10;
*(i.b) = 20;
AClass j = i;
*(i.b)=30; //这里改变的同时也影响对象j的值
i.a = 20; //这里改变的同时不会影响对象j的值
出现这个现象的原因是在对象复制时,默认的复制构造函数或赋值符号对指针的操作是复制指针,而不是复制值,在这种情况下我们便需自定义类的复制构造函数和赋值符号。
AClass(const AClass &c)
{
a = c.a;
b = new int;
*b = *(c.b);
}
AClass& operator=(const AClass &c)
{
a = c.a;
*b = *(c.b);
return *this;
}
~AClass()
{
delete b;
}
};
int main()
{
AClass i;
i.a = 10;
*(i.b) = 20;
AClass j = i;
*(i.b)=30;
i.a = 20;
cout<<"a="<<i.a<<";b="<<*(i.b)<<endl;
cout<<"a="<<j.a<<";b="<<*(j.b)<<endl;
}
其输出结果将为:
a=20;b=30;
a=10;b=20;
可以看到两个对象之间不在相互影响了。