EC读书笔记系列之11:条款20、21
2024-08-28 15:35:56
条款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对象的“现值”(我理解为即最新计算出来的那个值,∴两者一样!!)。
最新文章
- css:图标与文字对齐的两种方法
- 在eclipse的maven插件中搜寻本地仓库中的jar搜索不到的解决方案
- websocket---Html5
- 解决python ";Non-ASCII character";错误
- postgresql 触发器
- Helloworld模块之内核makefile详解
- 研究QGIS二次开发笔记(一)
- Grunt那些事
- 【原创】python实现清理本地缓存垃圾
- Android人脸识别App(带web上传注册信息)
- mysql识别中文
- Java设计模式之四 ----- 适配器模式和桥接模式
- Javascript 检测键盘按键
- phpstudy2018配置站点后500错误问题
- [Angularjs]ng-bind-html指令
- HDUOJ--4565 So Easy!
- Mysql 中 trim 的用法
- python16_day18【Django_Form表单、分页】
- RealSense R400系列深度相机的图像获取保存和格式转换
- ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)