您的位置:首页 > 编程语言 > C语言/C++

Effective C++ 学习笔记(7)

2015-05-27 17:35 267 查看
Term10: Have assignment operators return a reference to *this.

要求=以及类似的+=、*=的返回值为当前对象的引用。

这句话是什么意思呢?

1. 为什么=需要返回值

首先,重载的操作符对于类的对象来说,其实质是它的成员函数。而对于形如a=b的表达式,用fun()来代替=操作符,则相当于a.fun(b),在这个fun()函数内利用对象b来修改a的成员就可以完成赋值操作了。可是为什么还需要返回值呢?看下面一个表达式:

a=b=c;

根据操作符的结合律,其实质为:

a=(b=c);

如果它们的操作符=返回为void,则b=c虽然可以使b被c赋值,但a=一个void型的对象,编译错误。 因此返回*this可以使得形如b=c的表达式不仅为b赋值,而且表达式本身也是同样类型的对象,可以继续参与运算。

2.为什么返回值需要是*this的引用呢?

前面说到,返回*this可以使赋值表达式本身变成当前类型的对象,从而可以作为一个整体继续参与运算。看下面一个表达式:

(a=b)=c;

我们知道,对于基本类型而言,这个表达式的结果就是a先用b赋值,再用c赋值,从而最终结果是a的值是c。然而如果我们重载的操作符,返回的是*this,由于函数返回值的特性,那么实际的表达式a=b所代表的对象,其实是a对象的一个拷贝,而非a对象本身。那么最终被c赋值的是拷贝了a对象的一个临时对象,而a的值依然是由b赋值的。

说到函数返回值的特性,我们回到1中的表达式,其中在为a赋值的时候,使用b=c的返回值。如果是直接返回*this,那么其实为a赋值的是b对象的一个拷贝;但如果返回的是*this的引用,则并不需要拷贝,而直接用b对象对a进行赋值。也就是说在这种连续赋值的场景下,使用引用还可以削减不必要的拷贝构造函数的调用,从而提高性能。

综上所述,赋值操作符以及其类似的操作符,请返回*this的引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: