C++的赋值操作符(assignment operator)有一个有趣的用法:
int x, y, z;
x = y = z = 15; //链式赋值 (Chained assignment)
以上代码会被编译器从最右边开始解析 (right-associative):
x = (y = (z = 15)));
15先被赋值到z,z又被赋值到y,最后y被赋值到x
对于自定义的类,赋值操作符应遵循如下两点规则:
- 返回类型是一个当前类的引用
- 要返回*this给左边的变量
class Widget{
public:
...
Widget& operator=(const Widget& rhs){ //要返回一个当前类的引用
...
return *this; //返回给左边的变量
}
...
};
用引用是因为:
这样可以避免在函数调用时对实参的一次拷贝,提高了效率。
这个规则对+=, -=, *=等操作符同样适用。C++的自有类型,例如int, double,标准库的类型,例如std::string, std::complex,它们的赋值操作符都遵循这样的规则。
关于this,this是用来指向当前对象的指针,只存在于类的成员函数里,用来防止成员数据和成员函数参数的歧义:
class MessageBox{
public:
MessageBox(const std::string& message);
...
private:
std::string& message;
...
};
MessageBox::MessageBox(const std::string& message){
this -> message = message;
}
这里MessageBox类有一个数据成员叫message,同时它的构造函数也有一个参数叫message,此时为了避免歧义,我们用this->message来代表当前类的message成员。
总结:
- 赋值操作符应返回一个指向*this的引用