1、对于内置类型,x = x+y 与x+=y的结果相同。

2、 x=x+y 与 x+=y的结果相同,但二者做的事情差别很大。

  a、x=x+y做的事情:方法内有个局部对象,值为x+y,返回局部对象,返回值是个临时对象,这个临时对象赋值给x。

  b、x+=y做的事情:直接在x上操作,修改x的内容,并返回x的引用。

3、从上面的分析可以知道,操作符复合形式(+=)比单独形式(+)效率高很多,复合形式避免了局部对象和临时对象的构造和析构,以及对x的copy赋值。

4、为了避免重复代码和保持代码的一致性,应该让+调用+=,如下:

  template <typename T>

  const T operator+(const T& lhs, const T& rhs)

  {

    return T(lhs)+=rhs;

  }

  这里的return T(lhs)+=rhs; 等价于T result(lhs); return result+=rhs; 但是强烈建议使用前一种方式,为什么?

  前一种方式使用匿名对象,编译器更容易进行返回值优化(RVO)

5、考虑,复制操作符=返回引用,因此支持链式操作:a = b = c =d;  因此+=也支持链式操作。需要注意的是:=是从右向左进行,而+=应该是从左到右进行,为了保证从左到右进行必须使用小括号如下:(((a+=5)+=8)+=9)+=12; 这种方式有太多的括号,反而降低了可读性。使用a+=5;  a+=8;  a+=9;  a+=12; 这种方式更好。

6、复合形式效率高,但是不便利。单独形式效率低,但是很便利。两种方式都提供,用户可以自己选择。如下:

  Rational a, b, c, d, result;

  复合形式:

  result=a;

  result+=b;

  result+=c;

  result+=d;

  单独形式:

  result = a+b+c+d;

【M22】考虑以操作符复合形式(op=)取代其独身形式(op)的更多相关文章

  1. awk函数实现将点分式形式的掩码转换为十进制形式的掩码

    在用awk处理文本时,需要将源数据为点分式形式的掩码转换为十进制形式的掩码,下边的函数可简单实现: 转换功能函数cdr2mask function cdr2mask(mask_point) { num ...

  2. Python全栈开发-执行字符串形式的语句和字符串形式的表达式方法(即exec和eval方法)

    Python有时需要动态的创造Python代码,然后将其作为语句执行  或  作为表达式计算. exec用于执行存储在字符串中的Python代码.   1. 语句与表达式的区别:表达式是 某事,语句是 ...

  3. 深度优先搜索(DFS)递归形式改为非递归形式

    DFS将递归改为非递归这个方法的需求来自于一道三维积木组合的题目,还在苦苦调试中,暂且不提. 普通的认识对于递归向非递归的转化无非是使用栈,但是结合到深度搜索如何将栈很好利用,如何很好保存现场,都不是 ...

  4. 注解的形式与xml文件的形式完成事务管理及xml文件的配置

    需要的jar包: c3p0-0.9.2.1.jar com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1 ...

  5. java中把指数形式的数字转为正常形式显示

    /** * 当浮点型数据位数超过10位之后,数据变成科学计数法显示.用此方法可以使其正常显示. * @param value * @return Sting */ public static Stri ...

  6. MoreEffectiveC++Item35(效率)(条款16-24)

    条款16 谨记80-20法则 条款17 考虑使用 lazy evaluation(缓释评估) 条款18 分期摊还预期的计算成本 条款19 了解临时对象的来源 条款20 协助完成"返回值的优化 ...

  7. [More Effective C++]条款22有关返回值优化的验证结果

    (这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...

  8. C++学习书籍推荐《More Effective C++》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...

  9. More Effective C++笔记(二)

    三.异常 条款9:利用destructor避免泄露资源 把资源封装在对象内,通常可以在exception出现时避免资源泄露 条款10:在构造函数内阻止资源泄露 C++仅仅能删除被完全构造的对象(ful ...

随机推荐

  1. JavaScript备忘录-原型

    function Person() { this.name = "fs"; } Person.prototype.sayHello = function () { return & ...

  2. 【转】UITableView详解(UITableViewCell

    原文网址:http://www.kancloud.cn/digest/ios-1/107420 上一节中,我们定义的cell比较单一,只是单调的输入文本和插入图片,但是在实际开发中,有的cell上面有 ...

  3. HTTP请求中浏览器缓存

    本文导读:浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制.客户端缓存是否需要是可以在服务端代码上控制的.那就是响应头.响应头告诉缓存器不要保留缓存,缓存器就不会缓存相应内容:如果请求信息是需要 ...

  4. RMQ(dp)

    我一开始是不知道有这么个东西,但是由于最近在学习后缀数组,碰到一道题需要用到后缀数组+RMQ解决的所以不得不学习了. 原理:用A[1...n]表示一组数,dp[i][j]表示从A[i]到A[i+2^j ...

  5. lightoj 1024 (高精度乘单精度)

    题意:给你一些数,求它们的最小公倍数,结果可能会很大. 统计出每个素因子出现的最大次数,把他们相乘即可,需要高精度. #include<cmath> #include<cstdio& ...

  6. Python闭包与javascript闭包比较

    实例一 python def line_conf(): def line(x): return 2*x+1 print(line(5)) # within the scope     line_con ...

  7. MFC工程目录

    如果已经以Debug方式编译链接过程序,则会在解决方案文件夹下和工程子文件夹下各有一个名为“Debug”的文件夹,而如果是Release方式编译则会有名为“Release”的文件夹.这两种编译方式将产 ...

  8. The Administration Console(管理员控制台)

    当你的应用准备好了首次露面时,你要创建一个管理员用户以及将这个应用安装到App Engine上.你使用你的管理员帐户创建和管理这个应用,查看它的资源利用统计,消息日志以及更多.所有这些基于一个叫做管理 ...

  9. 配置RHadoop与运行WordCount例子

    1.安装R语言环境 su -c 'rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch. ...

  10. HTML5每日一练之input新增加的URL类型与email类型应用

    1.URL类型: <form> <input name="urls" type="url" value="http://www.w3 ...