//先看看下面这个例子
class Rational{
public:
Rational(int num, int denu)
:numirator(num), denumirator(denu);
const Rational operator*(const Rational & lhs, const Rational & rhs);//注意这里的返回类型
private:
int numirator;
int denumirator;
};
operator返回的是一个value而不是一个reference,如果想要这个函数返回一个reference的话(用来减少返回的时候拷贝带来的开销),可能希望像下面这样做:
1.在函数中使用new在heap上创建对象而不是在stack上创建对象:
Rational & operator(const Rational & lhs, const Rational & rhs)
{
Retional result = new Rational(lhs.numirator + rhs.numirator, lhs.denumirator * rhs.denumirator);
return result;
}
但是如果这么做的话谁又来保证客户可以安然无恙的将资源合理的释放呢。
2.在函数内部用static对象来取代临时变量,像下面这样:
const Rational & operator*(const Rational & lhs, const Rational & rhs)
{
static Rational result;
Rational = Ratioanl(lhs.numirator * rhs.numirator, lhs.denumirator * rhs.denumirator);
return result;
}

首先,加入static可定会对多线程的情况带来一些麻烦,再者看看下面这样的代码:

Rational a, b, c, d;
if(a * b == c * d);
//相当于if(operator*(a, b) == operator*(c, d))
  显然,这两个operator*返回的static变量肯定是指向同一个的,那么这个if必定等于1,毫无疑问,这里就可以看出这样做也是行不通的。
 
  其实正常的情况就是返回一个value就可以了,虽然可能带来效率上的损失(只是可能,现代的编译器有的都能消除这种情况带来的损失),这种损失也可以使用std::move来加以弥补。
 
  小结:绝对不要返回一个pointer或者reference指向一个local stack对象, 或者是一个reference指向一个heap allocated对象,或者返回一个local static对象而且又可能同时会用到这个local static对象。

条款21:必须返回对象的时候,不要妄想使其返回reference的更多相关文章

  1. 【21】必须返回对象时,别妄想返回器reference

    1.考虑有理数Rational,有个友元操作符*,返回Rational对象.返回对象,导致临时对象的构造,析构.效率低,因此会想返回方法内局部对象的引用,这种方法不可行.为什么? 2.调用方法是在st ...

  2. [Effective C++ --021]必须返回对象时,别妄想返回其reference

    引言 在条目20中,我们知道了值传递和引用传递的效率问题,因此在设计程序时,我们可能就尽可能来返回引用而不是值. 可是,可能会犯下面的一些错误:传递一些引用指向其实并不存在的对象. 第一节:返回临时变 ...

  3. Effective C++ -----条款21:必须返回对象时,别妄想返回其reference

    绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个loc ...

  4. 条款21:必须返回对象时,别妄想返回其reference(Don't try to return a reference when you must return an object)

    NOTE: 1.绝不要返回pointer或reference 指向一个local stack 对象,或返回reference 指向一个heap-allocated对象,或返回pointer 或refe ...

  5. 必须返回对象时,别妄想返回其reference 【Effective C++ 条款21】

    class Rational { public: Rational(, ) : n(numerator), d(denominator) { printf("Rational Constru ...

  6. 读书笔记_Effective_C++_条款二十一:当必须返回对象时,别妄想返回其reference

    在栈空间的临时成员变量在函数生命期结束后无法传出 friend A& operator*(const A& a, const A& b) { A temp; temp.data ...

  7. 条款21: 必须返回对象时,不要强行返回对象的reference

    总结: 绝不要返回一个local栈对象的指针或引用:绝不要返回一个被分配的堆对象的引用:绝不要返回一个静态局部对象(为了它,有可能同时需要多个这样的对象的指针或引用). 条款4中给出了“在单线程环境中 ...

  8. (C/C++学习)21.C++中返回引用和返回对象以及传引用和传对象问题

    说明:在学习和编写C++代码时,经常会遇到这样的问题:一个带返回值的函数,到底应该返回值呢,还是应该返回引用呢:在传递参数的时候,是应该传递参数的引用呢,还是应该传值呢?请看下面代码: void my ...

  9. js创建对象的三种方法:文本标识法和构造器函数法和返回对象的函数

    文本标识法和定义变量差不多,像这样 var obj = {name:'HanMM','2':'Dali'}; 函数构造器法  先创建一个对象函数 function Obj() { this.addre ...

随机推荐

  1. mysql与sql server参照对比学习mysql

    mysql与sql server参照对比学习mysql 关键词:mysql语法.mysql基础 转自桦仔系列:http://www.cnblogs.com/lyhabc/p/3691555.html ...

  2. DL for objection detection

    在计算机视觉领域,"目标检测"主要解决两个问题:图像上多个目标物在哪里(位置),是什么(类别).围绕这个问题,人们一般把其发展历程分为3个阶段:1. 传统的目标检测方法2. 以R- ...

  3. 使用Ehcache缓存同步启动时抛出异常net.sf.ehcache.CacheException: Can't assign requested address

    这个问题在插入公司内网网线的时候不会复现,由于我使用的是公司无线网络,故导致此问题. 具体解决办法是:在启动服务时,指定使用默认ipv4的网络接口.可以在启动jvm时添加参数-Djava.net.pr ...

  4. python删除目录下七天前创建的文件

    #coding=utf-8 import os import time import datetime def deleteOutdateFiles(path): """ ...

  5. django生成json

    好方便啊……list什么的一下都变成json了呢! import json from django.core.serializers.json import DjangoJSONEncoder def ...

  6. js验证真实姓名

    var regName = /^[\u4e00-\u9fa5]{2,4}$/; if (!regName.test(examinee.name)) { wx.showToast({ title: &q ...

  7. springmvc自定义视图

    自定义视图 可以整合jfreechart.excel @RequestMapping("/testView") public String testView(){ System.o ...

  8. C#属性器Get和Set

    public sealed class classroom { private List<string> student = new List<string>(); priva ...

  9. Linux下Mysql 操作命令

    Linux下Mysql 操作命令 一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlb ...

  10. 近千节点的Redis Cluster高可用集群案例:优酷蓝鲸优化实战(摘自高可用架构)

    (原创)2016-07-26 吴建超 高可用架构导读:Redis Cluster 作者建议的最大集群规模 1,000 节点,目前优酷在蓝鲸项目中管理了超过 700 台节点,积累了 Redis Clus ...