Effective C++ 条款21
必须返回对象时。别妄想返回其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相关推荐
- effective C++ 条款 21:必须返回对象时别妄想返回其reference
考虑有理数的class: class Rational { public: Rational(int numerator = 0, int denominator = 1); protecte ...
- effective c++条款11扩展——关于拷贝构造函数和赋值运算符
effective c++条款11扩展--关于拷贝构造函数和赋值运算符 作者:冯明德 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符. 以下讨论中将用到的例 ...
- Effective C++条款09:绝不在构造和析构过程中调用virtual函数
Effective C++条款09:绝不在构造和析构过程中调用virtual函数(Never call virtual functions during construction or destruc ...
- effective c++条款44 将与参数无关的代码抽离templates
effective c++条款44 将与参数无关的代码抽离templates 首先了解这个条款的含义:使用template可能导致代码膨胀,二进制码会带着重复(或者几乎重复)的代码.数据,或两者.其结 ...
- Effective C++ 条款02:尽量使用const,enum,inline替换#define
Effective C++ 条款02:尽量使用const,enum,inline替换#define 用另一句话说:用编译器代替预处理器比较好. 举个例子:加入定义一个常量: #define ASPEC ...
- 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++默默编写 ...
- Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously)
Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously) 条款40:明智而审慎地使用多重继承 1.多重继承的两个阵营 2 ...
- Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously)
Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously) 条款39:明智而审慎地使用private继承 1.pr ...
- 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 ...
最新文章
- 鸿海拟收购韩国家电企业东洋美吉 价格或达4.5亿美元
- C++ IPv4与IPv6的兼容编码(转,出自http://blog.csdn.net/ligt0610/article/details/18667595)...
- java内部类的定义原则
- 移动前端框架重构几个关键问题
- MYSQL索引失效的各种情形总结
- 首都师范大学计算机科学与技术考研分数线,2017考研:计算机科学与技术专业考研院校推荐之首都师范...
- 拓端tecdat|R语言DTW(Dynamic Time Warping) 动态时间规整算法分析序列数据和可视化
- zynq操作系统: Linux驱动开发串口篇
- android APK加密、签名
- 键盘按键的各种编码对照表
- 安卓逆向,Python爬虫,网页逆向和其他学习计划
- 基于TADK的SQLI检测
- 目前流行的数据分析软件有哪些?
- 这些数据结构基本概念你晓得几个嘞?
- Katalon Recorder安装及使用
- 计算机 存储体 存储单元 存储元 存储字 存储字长的联系
- 让AI为你制作思维导图 —— ChatMind
- php 获取指定日期的周几,周始,周末
- 研发流程:产品设计流程与文档规范
- 计算机网络毕业实训报告书,计算机网络实训报告书
热门文章
- linux centos7.2 nodeJs全局安装
- react(91)--debugger
- React工作(1)---export导出
- 前端学习(2987):vue+element今日头条管理--案例演示
- [html] 使用svg画一个微信的logo
- [vue] 请描述下vue的生命周期是什么?
- 前端学习(2736):重读vue电商网站46之执行build 时报错
- 工作238:Vue.js中this.$nextTick()的使用
- 前端学习(1694):前端系列javascript之变量计算
- Java面试题15牛客 以下关于Integer与int的区别错误的是