C++primer中的一道习题

编写Sales_item操作符用+进行实际加法而+=调用+。与本节中操作符的实现方法相比较讨论这个方法的缺点。Sales_... 编写Sales_item操作符用+进行实际加法而+=调用+。与本节中操作符的实现方法相比较讨论这个方法的缺点。
Sales_item Sales_item::operator+( const Sales_item& rhs )
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
将下面定义的非成员+=操作符声明为类Sales_item的友元 Sales_item operator+=( Sales_item& lhs, consSales_item& rhs )
{
lhs = lhs + rhs;
return lhs;
}
这个方法缺点在+=操作中需要创建和撤销一个临时Sales_item对象来保存+操作的结果没有本节中的方法简单有效。
首先我感觉他定义的加法操作就有问题吧。怎么能将结果赋值给左操作数呢?
还有调用+=重载函数是也没有创建类临时对象呀,答案上怎么说创建临时对象呢?
求解答。
展开
 我来答
百度网友7eff2e0
2012-12-23 · TA获得超过1043个赞
知道小有建树答主
回答量:787
采纳率:80%
帮助的人:531万
展开全部
1. 对于重载的操作符你应该等同看为类的一个成员函数。
lhs + rhs 这个表达式实际上是执行了 lhs.operator+(rhs); 注意,“operator+” 就是个普通函数名

2. 注意Sales_item::operator+() 和 operator+=() 的返回值类型是Sales_item,而不是Sales_item& 或Sales_item* 所以它们返回的是个类对象,凡是返回类对象的,返回的都是生成的临时对象。

简单的lhs = lhs + rhs; 实际执行步骤是:先调用lhs.operator+(rhs); 得到一个临时对象(此对象拷贝自lhs)然后调用lhs的等号操作符( lhs.operator=(临时对象); )

你可以自己编程验证一下。(比如在各重载操作符函数,构造函数,拷贝构造函数里加断点或打印语句,这样就能明白)
追问
抛开这个题来讲,是不是operator +()不对? 加法操作不应该改变左操作数吧。
追答
这要看你怎么定义“加法”。不过我也认为通常意义的"加法”不应改变两个加数的值,看来书作者定义了自己的一种"加法"。(不过你也不好说他这样不对)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式