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对象来保存+操作的结果没有本节中的方法简单有效。
首先我感觉他定义的加法操作就有问题吧。怎么能将结果赋值给左操作数呢?
还有调用+=重载函数是也没有创建类临时对象呀,答案上怎么说创建临时对象呢?
求解答。 展开
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对象来保存+操作的结果没有本节中的方法简单有效。
首先我感觉他定义的加法操作就有问题吧。怎么能将结果赋值给左操作数呢?
还有调用+=重载函数是也没有创建类临时对象呀,答案上怎么说创建临时对象呢?
求解答。 展开
1个回答
展开全部
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=(临时对象); )
你可以自己编程验证一下。(比如在各重载操作符函数,构造函数,拷贝构造函数里加断点或打印语句,这样就能明白)
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 +()不对? 加法操作不应该改变左操作数吧。
追答
这要看你怎么定义“加法”。不过我也认为通常意义的"加法”不应改变两个加数的值,看来书作者定义了自己的一种"加法"。(不过你也不好说他这样不对)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询