在C++中,赋值可以是递归的:
int x, y, z;
x = y = z = 10;
并且,赋值是遵循右结合律的,所以上面的赋值语句等价于:
x = (y = (z = 10));
所以,为了实现这样的连锁赋值方式,类的拷贝复制运算符必须要返回一个指向当前对象的引用:
class Object
{
//...
public:
Object &operator=(const Object &other)
{
//...
return *this;
}
};
这是一种规范,而不是编译器的要求。也就是说,即便不这样做(例如,让这个函数无返回值void
),代码照样可以通过编译,只是这个类会显得与C++的标准写法格格不入。
同样的规范也适用于所有和赋值相关的运算符中,例如:
class Object
{
//...
public:
Object &operator=(const Object &other)
{
//...
return *this;
}
Object &operator+=(const Object &other)
{
//...
return *this;
}
};
【注意】
令所有与赋值相关的运算符返回指向当前对象的引用。