必须返回对象时,别妄想返回其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对象,所以必定存在一次对象拷贝构造(如果编译器优化,则可省略)。

可以试着返回引用(指针效果一样),函数内部实现有如下几种:

  1. 使用局部对象
const Rational& operator * (const Rational& lhs, const Rational& rh)
{Rational result(lhs.n * rhs.n, lhs.d * rhs.d);return result;
}

返回局部对象的引用,同返回局部对象的指针一样,将导致未定义行为。

  1. 使用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, 总会出现一次内存泄露。

  1. 使用局部静态都对象
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相关推荐

  1. [EffectiveC++]item21:Don't try to return a reference when you must return an object

    转载于:https://www.cnblogs.com/jeanschen/p/3229602.html

  2. python return的理解_python 浅析对return的理解

    函数外部的代码要想获取函数的执行结果,就可以在函数里面用return语句,把结果返回. return 代表一个函数的终止,如果return 后面带一个print 或者return  ,则后面的不执行 ...

  3. return false的作用python_Python关键字return的作用

    1.返回一个值 2.终止一个函数的继续 复制代码 def my_len(): # 函数名的定义 s1='hello world' length=0 for i in s1: length=length ...

  4. java return返回值_java中关于return返回值的用法详解

    我们输入一个条件时,系统就会对这个条件进行判断,然后给出一个返回时的结论,我们把这个结果看做是返回值.在java里可以使用return语句来进行返回,从字面意思就能很好的理解它的用法了.下面我们就re ...

  5. python中return的理解-python中的return的返回与执行

    author:headsen chen date:2018-03-21 15:12:09 notice:created by headsen chen himself and not allowed ...

  6. return,return 0 ,return -1 , exit(-1),return 1

    对于main函数指定为int型,返回int值 return,return 0 ,return -1 , exit(-1) ,exit(0) return 如果什么都不接的话,其实就是void类型函数的 ...

  7. 小陈学JS return语句+break,continue,return的区别

    return语句 1)语法格式: 1.我们函数只是实现某种功能,最终的结果需要返回给函数的调用者   :函数名(),通过return实现的 2.只要函数遇到return就把后面你的结果 返回给函数的调 ...

  8. return在c语言的意思,return在c语言中是什么意思?_后端开发

    go语言通过命令方式生成可执行文件_后端开发 在我们编写好项目后一般都需要将其编译为可执行文件,本文就来为大家介绍一下go语言通过命令方式生成可执行文件的方法. return在c语言中是什么意思? r ...

  9. c语言 return两个值,c语言return能不能有2个以上返回值

    c语言return能不能有2个以上返回值 c语言return能不能有2个返回值 比如说return(a,b) 更新时间:2019-05-18 06:19 最满意答案 不是,要想返回2个以上返回值,建议 ...

  10. ajax请求return,细说JavaScript ajax异步请求return undefined

    在制作注册表单验证时我们需要通过ajax请求数据,例如我们需要请求数据库中的用户名判断是否存在,这时我们就需要return,再者我们很多时候需要使用数据库中的数据,这时我们也需要将数据返回出去. 我们 ...

最新文章

  1. 去掉星空极速,开通ADSL路由
  2. oracle测试表什么名字,Oracle_PLSQL测试题与答案(绝对经典)
  3. 额外篇 | basemap(上)
  4. 利用javascript实现简体与繁体的转换
  5. 配置httpd虚拟主机
  6. assertj断言异常_编写自定义的AssertJ断言
  7. vue computed 中操作DOM和给对象添加属性遇到的问题
  8. 轻松上云系列之二:其他云数据迁移至阿里云
  9. TCP/IP之免费arp分析
  10. HTML示例08---CSS3概述
  11. HP WebInspect 软件 简介
  12. 2020vue面试题汇总
  13. 关于php的梗儿_php是世界上最好的语言是什么梗?
  14. 基于融云直播 SDK,快速实现连麦布局(内附代码)
  15. Microbiome | 黄海所陈松林院士/华科宁康等-肠道菌群在龙利鱼(半滑舌鳎)抗弧菌病性状形成中的机制...
  16. 红帽linux安装网卡,redhat网卡驱动程序安装步骤
  17. nyoj-975-关于521
  18. Android学习视频推荐
  19. XGBoost详解(原理篇)
  20. vue 项目启动报错“Cannot GET /”

热门文章

  1. json数据格式分析
  2. Spring整合ActiveMQ之嵌入(二)
  3. 在Docker上运行微服务
  4. 理解String不可变
  5. WEB网页专业词汇 汇总
  6. Android 开发性能优化
  7. 3.Prometheus 监控技术与实践 --- Exporter
  8. 73. 简化 CSS 选择符
  9. 110个oracle常用函数总结(7),oracle110个最常用函数
  10. h5带mysql数据库的留言板_【mysql】用PHP写留言板,有回复功能,要写入数据库。...