在同一语句中重载运算符+多次

Overloading operator+ multiple times in same statement

本文关键字:运算符 多次 重载 语句      更新时间:2023-10-16

我有以下代码来重载operator+,当程序执行时,它可以正常工作。

main()函数中,当我重写语句以将重载的operator+从工作正常的res= t + t1 + t2调用到res = t + (t1 + t2)时,它不再工作。有人能给我一个解决方案,以及原因吗?

已经找到的解决方案是将operator+的签名从Test operator +(Test &a)更新为Test operator +(const Test &a)。在这里,我在参数列表中使用了const关键字。

#include <iostream>
using namespace std;
class Test
{
private:
int num;
public:
Test(int v)
{
num = v;
}
Test operator+(Test &a)
{
Test r(0);
r = num + a.num;
return r;
}
void show()
{
cout << "n num = " << num;
}
};
int main()
{
Test t(10);
Test t1(20);
Test t2(60);
Test res(0);
res = t + t1 + t2;
res.show();
return 0;
}

问题是通过非常数引用而不是const引用接受对象。

operator+()返回的Test对象是临时的。非常量引用无法绑定到临时引用。

这可能以前起作用的原因是operator+是从左到右执行的——看起来像这样:

object + object + object
temporary + object

临时仍然具有函数operator+(),因此它仍然可以被调用。

另一方面,当你使用括号时,它执行如下:

object + object + object
object + temporary

这意味着临时性终止于a,同样,由于上述原因,这是不可能发生的。

要修复此问题,a(将其转换为const引用,或者b(传递值(不推荐使用,因为它会在内存中创建不需要的额外副本(:

// a
Test operator +(const Test &a) 
// b
Test operator +(Test a) 

我还强烈建议将此函数作为const

// a
Test operator +(const Test &a) const
// b
Test operator +(Test a) const

现在,您可以添加const对象,即使它们也在右侧。

(t1 + t2)的计算结果为右值表达式。

但是你的operator+(&)只能绑定到非常值。另一方面,const &可以同时绑定左值和右值,因此operator+(const &)起作用。