21. Don't try to return a reference when you must return an object
必须返回对象时,别妄想返回其reference
class Rational
{public:Rational(int numerator = 0, int demoninator = 2);friend const Rational operator * (const Rational& lhs, const Rational& rhs); ...
private:int n, d;
}
因为 operator * 返回的是一个Ration对象,所以必定存在一次对象拷贝构造(如果编译器优化,则可省略)。
可以试着返回引用(指针效果一样),函数内部实现有如下几种:
- 使用局部对象
const Rational& operator * (const Rational& lhs, const Rational& rh)
{Rational result(lhs.n * rhs.n, lhs.d * rhs.d);return result;
}
返回局部对象的引用,同返回局部对象的指针一样,将导致未定义行为。
- 使用heap对象
const Rational& operator * (const Rational& lhs, const Rational& rh)
{Rational* result = new Rational(lhs.n * rhs.n, lhs.d * rhs.d);return *result;
}
咋看之下好像没问题,不过这样的话,堆内存的释放就必须由调用者完成。
不能确定调用者用完一定会释放。或者出现下面的调用,一定出现内存泄漏。
Rational w, x, y ,z;
w = x * y * z;
根据规则,先计算y * z, 结果在 * x, 总会出现一次内存泄露。
- 使用局部静态都对象
const Rational& operator * (const Rational& lhs, const Rational& rh)
{static Rational result(lhs.n * rhs.n, lhs.d * rhs.d);return result;
}
确实没有1中那么严重的问题。但是,如果有以下调用,结果总是为true
Ration a, b, c, d;
if ((a * b) == (c * d))...;
else...;
一个"必须返回新对象"的函数的正确写法是:就让那个返回返回一个新对象。
inline const Rational operator * (const Rational& lhs, const Rational& rh)
{Rational result(lhs.n * rhs.n, lhs.d * rhs.d);return result;
}
请记住:
绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象。
21. Don't try to return a reference when you must return an object相关推荐
- [EffectiveC++]item21:Don't try to return a reference when you must return an object
转载于:https://www.cnblogs.com/jeanschen/p/3229602.html
- python return的理解_python 浅析对return的理解
函数外部的代码要想获取函数的执行结果,就可以在函数里面用return语句,把结果返回. return 代表一个函数的终止,如果return 后面带一个print 或者return ,则后面的不执行 ...
- return false的作用python_Python关键字return的作用
1.返回一个值 2.终止一个函数的继续 复制代码 def my_len(): # 函数名的定义 s1='hello world' length=0 for i in s1: length=length ...
- java return返回值_java中关于return返回值的用法详解
我们输入一个条件时,系统就会对这个条件进行判断,然后给出一个返回时的结论,我们把这个结果看做是返回值.在java里可以使用return语句来进行返回,从字面意思就能很好的理解它的用法了.下面我们就re ...
- python中return的理解-python中的return的返回与执行
author:headsen chen date:2018-03-21 15:12:09 notice:created by headsen chen himself and not allowed ...
- return,return 0 ,return -1 , exit(-1),return 1
对于main函数指定为int型,返回int值 return,return 0 ,return -1 , exit(-1) ,exit(0) return 如果什么都不接的话,其实就是void类型函数的 ...
- 小陈学JS return语句+break,continue,return的区别
return语句 1)语法格式: 1.我们函数只是实现某种功能,最终的结果需要返回给函数的调用者 :函数名(),通过return实现的 2.只要函数遇到return就把后面你的结果 返回给函数的调 ...
- return在c语言的意思,return在c语言中是什么意思?_后端开发
go语言通过命令方式生成可执行文件_后端开发 在我们编写好项目后一般都需要将其编译为可执行文件,本文就来为大家介绍一下go语言通过命令方式生成可执行文件的方法. return在c语言中是什么意思? r ...
- c语言 return两个值,c语言return能不能有2个以上返回值
c语言return能不能有2个以上返回值 c语言return能不能有2个返回值 比如说return(a,b) 更新时间:2019-05-18 06:19 最满意答案 不是,要想返回2个以上返回值,建议 ...
- ajax请求return,细说JavaScript ajax异步请求return undefined
在制作注册表单验证时我们需要通过ajax请求数据,例如我们需要请求数据库中的用户名判断是否存在,这时我们就需要return,再者我们很多时候需要使用数据库中的数据,这时我们也需要将数据返回出去. 我们 ...
最新文章
- 去掉星空极速,开通ADSL路由
- oracle测试表什么名字,Oracle_PLSQL测试题与答案(绝对经典)
- 额外篇 | basemap(上)
- 利用javascript实现简体与繁体的转换
- 配置httpd虚拟主机
- assertj断言异常_编写自定义的AssertJ断言
- vue computed 中操作DOM和给对象添加属性遇到的问题
- 轻松上云系列之二:其他云数据迁移至阿里云
- TCP/IP之免费arp分析
- HTML示例08---CSS3概述
- HP WebInspect 软件 简介
- 2020vue面试题汇总
- 关于php的梗儿_php是世界上最好的语言是什么梗?
- 基于融云直播 SDK,快速实现连麦布局(内附代码)
- Microbiome | 黄海所陈松林院士/华科宁康等-肠道菌群在龙利鱼(半滑舌鳎)抗弧菌病性状形成中的机制...
- 红帽linux安装网卡,redhat网卡驱动程序安装步骤
- nyoj-975-关于521
- Android学习视频推荐
- XGBoost详解(原理篇)
- vue 项目启动报错“Cannot GET /”