条款20 宁以pass-by-reference-to-const替换pass-by-value

记住:

★尽量以pass-by-reference-to-const替换pass-by-value。前者通常高效,并可避免切割问题

★以上规则并不适用于内置类型,以及STL的迭代器函数对象。那些应用pass-by-value

条款21 必须返回对象时,别妄想返回其reference

记住:

★绝不要返回pointer或reference指向一个local stack对象(如函数里的局部对象);或返回pointer或reference指向一个heap-allocated对象;或返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象。(条款4已经为“在单线程环境中合理返回一个reference指向一个local static对象”提供了一份设计实例)

---------------------------------------------------------------------------

绝不要返回pointer或reference指向一个local stack对象这个好理解,在此不举例

特地举例说明如下情况的危险性:

返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象:

const Rational& operator*( const Rational &lhs, const Rational &rhs ) {
static Rational result; //local static对象
result = ...;
return result; //这里返回的是引用
}
若客户代码如下:
bool operator==( const Rational &lhs, const Rational &rhs );
Rational a,b,c,d;
...
if( ( a*b ) == ( c*d ) ) { //总是为true!!!!!!!!!!!!
  …
}
else {
  …
}

if语句永远为true,∵两次operator*调用的确各自改变了static Rational对象值,但由于它们返回的都是reference,∴调用端看到的永远是static Rational对象的“现值”(我理解为即最新计算出来的那个值,∴两者一样!!)。

最新文章

  1. css:图标与文字对齐的两种方法
  2. 在eclipse的maven插件中搜寻本地仓库中的jar搜索不到的解决方案
  3. websocket---Html5
  4. 解决python "Non-ASCII character"错误
  5. postgresql 触发器
  6. Helloworld模块之内核makefile详解
  7. 研究QGIS二次开发笔记(一)
  8. Grunt那些事
  9. 【原创】python实现清理本地缓存垃圾
  10. Android人脸识别App(带web上传注册信息)
  11. mysql识别中文
  12. Java设计模式之四 ----- 适配器模式和桥接模式
  13. Javascript 检测键盘按键
  14. phpstudy2018配置站点后500错误问题
  15. [Angularjs]ng-bind-html指令
  16. HDUOJ--4565 So Easy!
  17. Mysql 中 trim 的用法
  18. python16_day18【Django_Form表单、分页】
  19. RealSense R400系列深度相机的图像获取保存和格式转换
  20. ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)

热门文章

  1. sso单点登录解决方案收集
  2. Android单元測试之JUnit
  3. mobilebone.js 移动web APP单页切换骨架
  4. JS中的Function对象
  5. Oracle的关于建表,约束,查询等的练习
  6. uilable 换行标记
  7. iOS开发之设置界面的抽取
  8. 机器学习(Machine Learning)
  9. PHP简易计算器方法1
  10. Deepin 15.3 下罗技蓝牙键盘连接