C++ 赋值运算符重载详解
1. 赋值运算符重载的标准格式
核心要求
cpp
class T { public:T& operator=(const T& rhs) { // 参数类型:const T&if (this != &rhs) { // 检测自赋值// 执行拷贝操作}return *this; // 返回T&} };
关键点解析
要素 | 说明 |
---|---|
参数类型 | const T& :避免拷贝开销,保护原对象不被修改 |
返回值类型 | T& :支持连续赋值(如 a = b = c ),同时避免返回时的额外拷贝 |
自赋值检查 | if (this != &rhs) :防止资源重复释放或逻辑错误 |
返回 *this | 返回赋值后的对象 |
2. 必须定义为成员函数的原因
-
编译器强制行为:
如果用户未定义,编译器会自动生成一个默认的operator=
(称为合成拷贝赋值运算符)。
如果允许全局重载,会导致二义性冲突:cpp
class T { /* 编译器生成默认 operator= */ }; T& operator=(T& lhs, const T& rhs); // 如果允许全局定义,调用时该选哪个?
-
封装性要求:
赋值操作通常需要访问类的私有成员,定义为成员函数更符合面向对象设计原则(避免滥用友元)。
3. 默认生成的赋值运算符行为
规则
-
内置类型:按字节浅拷贝(直接赋值,包括指针的地址值)。
-
自定义类型成员:调用该成员的
operator=
完成赋值(递归处理)。