EC读书笔记系列之11:条款20、21
条款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对象的“现值”(我理解为即最新计算出来的那个值,∴两者一样!!)。
EC读书笔记系列之11:条款20、21的更多相关文章
- EC读书笔记系列之20:条款53、54、55
条款53 不要轻忽编译器的警告 记住: ★严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉 ★不要过度依赖编译器的报警能力,∵不同的编译器对待事情的态度 ...
- EC读书笔记系列之6:条款11 在operator=中处理自我赋值
记住: ★确保当对象自我赋值时operator=有良好行为.有三种方法:比较“来源对象”和“目标对象”的地址.精心周到的语句顺序.以及copy-and-swap技术 ★确定任何函数若操作一个以上对象, ...
- EC读书笔记系列之16:条款35、36、37、38、39、40
条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ...
- EC读书笔记系列之14:条款26、27、28、29、30、31
条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ----------------------- ...
- EC读书笔记系列之1:条款1、条款2、条款3
条款1:视C++为一个语言联邦 记住: ★C++高效编程守则视状况而变化,这取决于你使用C++的哪一部分 C: Object-oriented c++: Template c++: STL 条款2:尽 ...
- EC读书笔记系列之19:条款49、50、51、52
条款49 了解new-handler的行为 记住: ★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用 ★Nothrow new是一个颇为局限的工具,∵其只适用于内存 ...
- EC读书笔记系列之18:条款47、48
条款47 请使用traits classes表现类型信息 记住: ★Traits classes使得“类型相关信息”在编译期可用.它们以templates和“templates特化”完成实现 ★整合重 ...
- EC读书笔记系列之17:条款41、42、43、44、45、46
条款41 了解隐式接口与编译器多态 记住: ★classes和templates都支持接口和多态 ★对classes而言接口是显式的(explicit),以函数签名为中心.多态则是通过virtual函 ...
- EC读书笔记系列之15:条款32、33、34
条款32 确保你的public继承塑模出is-a关系 记住: ★public继承意味着is-a.适用于base class身上的每一件事情一定也适用于derived class身上,∵每一个deriv ...
随机推荐
- MODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_LICENSE宏
在阅读Linux Driver源码时,我们常常会在文件的结尾处看到诸如:MODULE_AUTHOR.MODULE_DESCRIPTION.MODULE_LICENSE等宏定义,这些宏主要是定义了一些模 ...
- SharePoint Search之(一):创建Search服务应用程序
计划写一个关于怎样使用SharePoint Search的系列,包括下面几个方面: (一)创建Search Service Application (二)持续爬网(continues crawl) ( ...
- Java Swing界面编程(27)---JRadioButton事件处理
在单选button操作中.能够使用ItemListener接口进行事件的监听. package com.beyole.util; import java.awt.Container; import j ...
- http头部信息研究
1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type. 2. Accept-Charset: 浏览器申明自 ...
- UVA 10410 Tree Reconstruction
题意: 给定一个树的BFS和DFS,求这棵树. 分析: 拿dfs的序列,分成若干段,每一段相当一个子树,这样就可以利用bfs的序列去将dfs的序列分段,然后利用一个队列去存放每一段,不断求出子树即可. ...
- HTML——表格与表单
1.表格 <table></table> background:背景图片. 属性 值 描述 align left center right 不赞成使用.请使用样式代替. 规定表 ...
- Spring事务传播机制详解
1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Support a current transaction, create a new one if none ...
- sqlyog绿色破解版
http://pan.baidu.com/s/1mghyUrY 下载地址
- HDU 1045(Fire Net)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...
- 【学习笔记01】:hover为DIV添加鼠标悬停时改变颜色的效果
:hover所有主流浏览器都支持(IE6.0以下支持不好,以后再学习用Javascript来实现悬停效果) 这是一个绿色底白色Icon的搜索按钮