关于赋值,你可以把它们写成连锁形式:
int x, y, z;
x=y=z=5;赋值采用右结合律,所以上述连锁赋值被解析为:x=(y=(z=5));
这里5先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x
为了实现“连锁赋值”,赋值操作符必须返回一个 “引用”,指向操作符的左侧实参。
class Color{
public:
Color& operator=(const Color& rhs){ //返回一个&,指向当前对象
...
return* this; //返回左侧对象
}
};
class Color{
public:
Color& operator+=(const Color& rhs) //这个方式也适用于+=,-=,*=等等
return* this;
}
};
注意,这只是一个约定,并不是强制性的。如果不遵循它,代码一样可通过编译。然而这份约定被所有内置类型和标准程序库提供的类型如 string, vector, complex,tr1:: shared_ptr等共同遵守。因此除非你有一个标新立异的好理由,不然还是随众吧。