重用运算符函数返回的对象

reusing the returned object from operator function

本文关键字:对象 返回 函数 运算符      更新时间:2023-10-16

考虑以下操作员过载场景

class integer
{
   public:
   int a;
   integer()
   {
        a = 0;
   }
  friend integer operator+(integer &a ,int b);
};
integer operator+(integer &a,int b)
{
    a.a = a.a + b;
    return a;
}
int main()
{
   integer obj;
   integer obj2;
   obj+2; //Line 1.  this works.

operator+函数返回一个integer类型的对象。那么,为什么我不能执行像这样的函数调用呢

(obj+2)+3; //no match for 'operator+' (operand types are 'integer' and 'int')

当工作时

obj2 = obj+2;
obj2+3;

integer &a表示a只能引用左值。但obj+2不是左值。

要解决此问题,您应该将参数更改为integer a,即:

  • 可以绑定到右值
  • 使您的函数实际执行operator+的函数

如果您的第一个参数是integer&,则表明您正在尝试编写operator+=。对于该函数,解决方案是还返回integer&,因此obj+=2是一个左值。

作为M.M答案的必然结果(您应该接受),这里是固定代码:

class integer
{
   public:
   int a;
   integer()
   {
        a = 0;
   }
  friend integer operator+(integer a ,int b);
};
// fix: arg 1 passed by value
integer operator+(integer a,int b)
{
    a.a = a.a + b;
    return a;
}
int main()
{
   integer obj;
   integer obj2;
   obj+2;
  (obj+2)+3;
}