C++ 赋值运算符重载
概述
在C++中,赋值运算符(=
)是我们经常使用的运算符之一。当我们处理自定义类时,如果不重载赋值运算符,编译器会为我们生成一个默认版本,但这个默认版本可能无法满足我们的需求,特别是当类中包含动态分配的内存时。
赋值运算符重载允许我们自定义对象间赋值的行为,是C++面向对象编程中的重要概念。
备注
赋值运算符与拷贝构造函数不同:
- 拷贝构造函数在创建新对象时初始化
- 赋值运算符在已存在的对象间赋值时调用
为什么需要重载赋值运算符?
考虑以下情况:
class MyString {
private:
char* data;
int length;
public:
// 构造函数
MyString(const char* str = nullptr);
// 析构函数
~MyString();
};
MyString s1("Hello");
MyString s2 = s1; // 使用默认的赋值运算符
如果不重载赋值运算符,编译器生成的默认版本会执行浅拷贝,即直接复制指针而不是指针指向的内容。这可能导致:
- 内存泄漏:原对象的资源没有被正确释放
- 重复释放:两个对象指向相同的内存,在析构时会导致重复释放
- 数据一致性问题:一个对象修改了数据,会影响另一个对象