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的引用。
要求=以及类似的+=、*=的返回值为当前对象的引用。
这句话是什么意思呢?
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的引用。
相关文章推荐
- Effective C++ 学习笔记<1> 视C++为一个语言联邦
- Effective C++ 学习笔记(四)
- effective c++学习笔记二
- “Effective C++ Third Edition”学习笔记(一)
- Effective C++ 学习笔记(六)
- Effective C++ 学习笔记2
- Effective C++ 学习笔记14
- effective c++ 学习笔记 1
- Effective c++ 学习笔记 1
- Effective C++ 学习笔记(27)
- Effective C++学习笔记:对应的new和delete要采用相同的形式
- More Effective C++学习笔记-条款1|2|3|4
- Effective C++学习笔记之第四章(5)
- Effective C++ 学习笔记(五)
- Effective C++ 学习笔记(8)
- Effective C++ 学习笔记(九)
- More Effective C++ 学习笔记(2)
- Effective C++ 学习笔记(23)
- Effective C++ 学习笔记(5)
- “Effective C++ Third Edition”学习笔记(三)