答案与拷贝构造函数一样。
如果一个类不包含指针,则不需要自定义赋值操作符与拷贝构造函数。编译器会给每个类创建一个默认的拷贝构造函数和默认的赋值操作符。
但是,当类中包含有指针或任何运行时分配的资源时,编译器生成的这两个函数,可能会失效。
参考下面程序:
#include<iostream>
using namespace std;
// 没有自定义赋值操作符
class Test {
int* ptr;
public:
Test(int i = 0) { ptr = new int(i); }
void setValue(int i) { *ptr = i; }
void print() { cout << *ptr << endl; }
};
int main() {
Test t1(5);
Test t2;
t2 = t1;
t1.setValue(10);
t2.print();
return 0;
}
运行结果:
10
仔细看下main函数,会发现使用setValue()修改了t1的值后,对象t2也跟着改变了。这会导致未知的行为。
因为上面程序没有自定义赋值操作符,所以编译器生成了一个默认的,会将ptr从右侧拷贝到左侧。所以两个对象中的ptr指向相同位置。
可以使用两种方法来解决上面问题:
1) 禁止对象之间进行赋值操作。我们可以使用自定义的赋值运算符并定义为private。
2) 自定义赋值运算符来实现深拷贝(deep copy)。
对于拷贝构造函数,也是同样的道理。
下面是重载了赋值运算符后的程序: