在C++的赋值操作符operator= 通常需要返回一个当前对象的引用,有以下原因:
1、支持链式赋值
- 返回*this的引用允许进行链式赋值操作。
- 如下代码中,b=c会返回b的引用,然后a=(b=c)会继续使用这个引用来赋值给a,如果operator= 不返回引用,链式赋值将无法正常工作。
a = b = c;
2、保持一致性
- C++标准库中的许多类和内置类型(int,double等)的赋值操作符都返回引用为了保持一致性,用户自定义类型的赋值操作符,最好也返回引用。
- int基本数据类型的赋值操作福=,是由编译器直接实现,没有显示的源码实现,底层对应一条机器指令(mov指令)
3、避免不必要的拷贝
- 如果operator= 的返回值不是引用,那么在赋值操作完成后,会生成一个临时对象并返回它,导致不必要的拷贝操作
class MyClass {
public:
MyClass(int value) : data(value) {}
// 错误的 operator= 实现,返回值而不是引用
MyClass operator=(const MyClass& other) {
if (this != &other) {
data = other.data;
}
return *this;
}
int getData() const { return data; }
private:
int data;
};
上述代码进行链式赋值操作:
- b=c会返回一个MyClass的临时对象,而不是b的引用。然后a=(b=c)会使用这个临时对象来赋值给a
- 这不仅会导致不必要的拷贝
- 还会导致a和b 的值不一致,因为a实际上是被赋值为一个临时对象,而不是b的引用。
MyClass a(1), b(2), c(3);
a = b = c;
正确实现:
class MyClass {
public:
MyClass(int value) : data(value) {}
// 正确的 operator= 实现,返回引用
MyClass& operator=(const MyClass& other) {
if (this != &other) {
data = other.data;
}
return *this;
}
int getData() const { return data; }
private:
int data;
};
** 4、this 与 *this **
- C++中,this指针是一个指向当前对象的指针,他是一个隐含的指针,在类的成员函数中,this->data和data是等价的,都表示当前对象的成员变量。
- *this 是对this指针的解引用,表示当前对象本身的值。
思维导图笔记