调用operator+=来定义operator+比其他方法更有效?

如题,下面给出operator+=和operator+的实现

 1 Sales_data&
 2 Sales_data::operator+=(const Sales_data &rhs)
 3 {
 4     units_sold += rhs.units_sold;
 5     revenue += rhs.revenue;
 6     return *this;
 7 }
 8
 9 Sales_data
10 operator+(const Sales_data &lhs, const Sales_data &rhs)
11 {
12     Sales_data sum = lhs;13     sum += rhs;
14     return sum;
15 }

上面的代码是用调用operator+来定义operator+=的。

首先operator+有两个参数,其参数类型为const,是不需要改变的,其返回类型为Sales_data类型的一个拷贝。不过每次都需要在函数体内定义一个临时变量,用来返回拷贝。

而operator+=有一个参数,其参数类型为const,不需要改变,其返回类型为Sales_data类型的引用。每次不需要在函数内创建临时变量,直接可返回*this。

如果用operator+来定义operator+=的话,则不论调用operator+还是operator+=,每次都会创建一个Sales_data的临时变量。

所以说调用operstor+=来定义operator+是更有效率的。

你也会觉得这个问题对你有帮助:

http://stackoverflow.com/questions/21071167/why-is-it-more-efficient-to-define-operator-to-call-operator-rather-than-the

时间: 2024-11-13 09:51:14

调用operator+=来定义operator+比其他方法更有效?的相关文章

Android Studio "diamond operator is not supported" 处理方法

低版本的android编译环境是不支持使用java7语法的,如果使用了,就会产生上述问题,如果你的android环境较新,那么可以使用以下方法: 在build.gradle的android标签下加入以下代码 compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } Android Studio "diamond operator is not

C++中的new/delete与operator new/operator delete

new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数. new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载 operator new(1)只分配所要求的空间,不调用相关对象的构造函数.当无法满足所要求分配的空间时,则        ->如果有new_handler,则调用new_handler,否则        ->如果没要求不

C++内存管理(new operator/operator new/operator delete/placement new)

new operator 我们平时使用的new是new操作符(new operator),就像sizeof一样是语言内置的,不能改变它的含义,功能也是一样的 比如: string *ps = new string("Memory Management"); 相当于 void *memory = operator new(sizeof(string)); // 得到未经处理的内存,为String对象 call string::string("Memory Management&

C++ new/new operator、operator new、placement new初识

简要释义 1.operator new是内存分配函数(同malloc),C++在全局作用域(global scope)内提供了3份默认的operator new实现,并且用户可以重载operator new. 1 void* operator new(std::size_t) throw(std::bad_alloc);//normal new 2 void* operator new(std::size_t,const std::nothrow_t&) throw();//nothrow ne

C++ new operator, delete operator, operator new, operator delete, new placement

http://www.younfor.com/cpp-new-placement-new-operator-new.html http://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html http://kelvinh.github.io/blog/2014/04/19/research-on-operator-new-and-delete/ new operator 就是C++中定义的关键字new,调用new而触发的行为,del

PHP调用OCX控件的具体方法

需要设置php.ini文件,找到这行com.allow_dcom=true,把com组件支持启用 使用PHP调用OCX控件,本不是个难题,但现实中采用flash回避的方法更通用.真正使用ocx的不多,而且资料也比较少,从网上看到了一个成功的例子: 其实调用 OCX或者什么什么的控件文件包含进来 include("D:\wwwroot\Authen\Authen.ocx"); 然后用COM函数调用它 其中参数是以 文件名.类名的形式调用的 这点由为重要 $word = new COM(&

C++中的::operator new, ::operator delete

一般在使用new  和 delete的时候,做了两件事情,一是空间的配置( new 是分配,delete是回收),而是调用对象的析构函数 但是也有办法将这两个过程分开 那就是显式的调用::operator new, ::operator delete,它们只进行空间配置,并不调用对象的析构函数 具体的可以参看下面这个例子: // operator new[] example #include <iostream> // std::cout #include <new> // ::o

C# ASP.NET Webservice调用外部exe无效的解决方法

最近用asp.net做webservice,其中有个功能是调用执行外部的exe(类似cmd中执行),但执行Process.Start之后就没有结果,同样代码在winform下正常,折腾两天终于找到解决方法 本文参考了以下网页,十分感谢 http://bbs.csdn.net/topics/300053869 http://blog.163.com/[email protected]/blog/static/15737970200862331842368/ 环境:win7 sp1 64位 以及II

Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法

public class SuperClass{ public void printA(){ System.out.print("SuperClass-printA"); printB(); } public void printB(){ System.out.print("SuperClass-printB"); } } public class ChildClass extends SuperClass{ public void printA(){ System