EC读书笔记系列之11:条款20、21
2015-11-05 09:38
169 查看
[b]条款20 宁以pass-by-reference-to-const替换pass-by-value[/b]
记住:
★尽量以pass-by-reference-to-const替换pass-by-value。前者通常高效,并可避免切割问题
★以上规则并不适用于内置类型,以及STL的迭代器和函数对象。那些应用pass-by-value
[b]条款21 必须返回对象时,别妄想返回其reference[/b]
记住:
★绝不要返回pointer或reference指向一个local stack对象(如函数里的局部对象);或返回pointer或reference指向一个heap-allocated对象;或返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象。(条款4已经为“在单线程环境中合理返回一个reference指向一个local static对象”提供了一份设计实例)
---------------------------------------------------------------------------
绝不要返回pointer或reference指向一个local stack对象这个好理解,在此不举例
特地举例说明如下情况的危险性:
返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象:
if语句永远为true,∵两次operator*调用的确各自改变了static Rational对象值,但由于它们返回的都是reference,∴调用端看到的永远是static Rational对象的“现值”(我理解为即最新计算出来的那个值,∴两者一样!!)。
记住:
★尽量以pass-by-reference-to-const替换pass-by-value。前者通常高效,并可避免切割问题
★以上规则并不适用于内置类型,以及STL的迭代器和函数对象。那些应用pass-by-value
[b]条款21 必须返回对象时,别妄想返回其reference[/b]
记住:
★绝不要返回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对象的“现值”(我理解为即最新计算出来的那个值,∴两者一样!!)。
相关文章推荐
- 用dumpdecrypted给App砸壳
- json editor verify online
- Spring-mvc整合mybatis-oracle11g-druid数据源
- JSON.parse()和JSON.stringify()
- 【总结】10月训练赛第1场
- 使用update-alternatives切换ubuntu下默认java命令
- 最新】TCL智能电视root破解 &安装第三方软件教程
- 矩阵快速幂
- 关于打包自定义标签,并导入项目使用时,出现java.lang.NoClassDefFoundError: JspException异常,解决方法和注意事项!
- DefaultHttpClient使用
- oracle 怎么debug
- Android利用反射获取状态栏(StatusBar)高度
- 打包Assetbundle并加载
- 疯狂的无人机:大疆面临小米和数百创业公司的集体“围剿”---ESM
- 【转】Android源代码查看途径
- 解决:Windows 强制升级为8.1之后 Mysql连接不上, VisualSVN Server无服务
- 【python】break和continue
- 动态绑定滚动条事件
- mysql 常用系统函数
- 携程Android App插件化和动态加载实践