必须返回对象时。别妄想返回其reference

我们上节分析了对象引用传递的优点,如今说明函数返回引用对象带来的种种坏处。
先来一段代码:

class Rational{
public:Rational(int numerator=0, int denominator=1);……
private:int n, d;friendconst Rational operator*(const Rational& lhs,const Rational& rhs);
};const Rational& operator*(const Rational& lhs, const Rational& rhs)
{Rational result(lhs.n* rhs.n, lhs.d* rhs.d);return result;
}Rational a(1,2),b(3,4);
Rational &r=a*b;

大家看看以上代码有没有问题。非常显然此时的r是返回值的引用。非常明显对象本体已在operator*函数范围外被销毁。此时的r指向的对象已经被系统回收。程序非常easy出现错误。

那么,假设在函数体内动态创建对象呢?
例如以下代码:

const Rational& operator*(const Rational& lhs, const Rational& rhs)
{Rational* result=new Rational(lhs.n* rhs.n, lhs.d* rhs.d);return *result;
}Rational w,x,y,z;
w=x*y*z;

上面代码有什么问题?
非常显然造成了内存泄露,两次调用 operator*函数,创建两个动态内存对象,可是最后却没有delete。

假设创建static 对象呢?

const Rational& operator*(const Rational& lhs, const Rational& rhs)
{static Rational result;result=……;return result;
}bool operator==(const Rational& lhs, const Rational& rhs);
Rational a, b, c, d;
……
if((a*b)==(c*d))
{doSomething();
}
else
{doOtherthing();
}

上面代码有什么问题?
答案是上面代码中(a*b)==(c*d)的值一直为真。这是static的特性。所以。operator*的函数设计不合理,导致operator==出错。

说到如今总结一下。

非常简单就想题目所说函数必须返回对象时。别妄想返回其reference。那返回什么?非常明显返回对象的值而不是引用。

转载于:https://www.cnblogs.com/jzdwajue/p/7268284.html

Effective C++ 条款21相关推荐

  1. effective C++ 条款 21:必须返回对象时别妄想返回其reference

    考虑有理数的class: class Rational { public:     Rational(int numerator = 0, int denominator = 1); protecte ...

  2. effective c++条款11扩展——关于拷贝构造函数和赋值运算符

    effective c++条款11扩展--关于拷贝构造函数和赋值运算符 作者:冯明德 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符. 以下讨论中将用到的例 ...

  3. Effective C++条款09:绝不在构造和析构过程中调用virtual函数

    Effective C++条款09:绝不在构造和析构过程中调用virtual函数(Never call virtual functions during construction or destruc ...

  4. effective c++条款44 将与参数无关的代码抽离templates

    effective c++条款44 将与参数无关的代码抽离templates 首先了解这个条款的含义:使用template可能导致代码膨胀,二进制码会带着重复(或者几乎重复)的代码.数据,或两者.其结 ...

  5. Effective C++ 条款02:尽量使用const,enum,inline替换#define

    Effective C++ 条款02:尽量使用const,enum,inline替换#define 用另一句话说:用编译器代替预处理器比较好. 举个例子:加入定义一个常量: #define ASPEC ...

  6. Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)

    Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls) 条款05:了解C++默默编写 ...

  7. Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously)

    Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously) 条款40:明智而审慎地使用多重继承 1.多重继承的两个阵营 2 ...

  8. Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously)

    Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously) 条款39:明智而审慎地使用private继承 1.pr ...

  9. Effective C++条款20:宁以pass-by-reference-to-const替换pass-by-value

    Effective C++条款20:宁以pass-by-reference-to-const替换pass-by-value(Prefer pass-by-reference-to-const to p ...

最新文章

  1. 鸿海拟收购韩国家电企业东洋美吉 价格或达4.5亿美元
  2. C++ IPv4与IPv6的兼容编码(转,出自http://blog.csdn.net/ligt0610/article/details/18667595)...
  3. java内部类的定义原则
  4. 移动前端框架重构几个关键问题
  5. MYSQL索引失效的各种情形总结
  6. 首都师范大学计算机科学与技术考研分数线,2017考研:计算机科学与技术专业考研院校推荐之首都师范...
  7. 拓端tecdat|R语言DTW(Dynamic Time Warping) 动态时间规整算法分析序列数据和可视化
  8. zynq操作系统: Linux驱动开发串口篇
  9. android APK加密、签名
  10. 键盘按键的各种编码对照表
  11. 安卓逆向,Python爬虫,网页逆向和其他学习计划
  12. 基于TADK的SQLI检测
  13. 目前流行的数据分析软件有哪些?
  14. 这些数据结构基本概念你晓得几个嘞?
  15. Katalon Recorder安装及使用
  16. 计算机 存储体 存储单元 存储元 存储字 存储字长的联系
  17. 让AI为你制作思维导图 —— ChatMind
  18. php 获取指定日期的周几,周始,周末
  19. 研发流程:产品设计流程与文档规范
  20. 计算机网络毕业实训报告书,计算机网络实训报告书

热门文章

  1. linux centos7.2 nodeJs全局安装
  2. react(91)--debugger
  3. React工作(1)---export导出
  4. 前端学习(2987):vue+element今日头条管理--案例演示
  5. [html] 使用svg画一个微信的logo
  6. [vue] 请描述下vue的生命周期是什么?
  7. 前端学习(2736):重读vue电商网站46之执行build 时报错
  8. 工作238:Vue.js中this.$nextTick()的使用
  9. 前端学习(1694):前端系列javascript之变量计算
  10. Java面试题15牛客 以下关于Integer与int的区别错误的是