在C++中为两个/两个以上的对象重载了加法赋值运算符?

Rau*_*ulp 15 c++ operator-overloading

我像这样重载了+运算符

class sample
{
private : 
  int x;
public :
  sample(int x1 =0)
  {
    x = x1;
  }

  sample operator+(sample s);
};

sample sample::operator+(sample s)
{
  x = x + s.x;
  return *this;
}

int  main()
{
  sample s1(10);
  sample s2;
  s2 = s2 + s1;
  return 0;    
}
Run Code Online (Sandbox Code Playgroud)

它是否正确?我的问题是如果我想添加两个不同的样本对象,我将如何重载opeartor; 例如s = s1 + s2;

我觉得要做s = s + s1 + s2现有的实施.

hig*_*aro 22

使用友元运算符重载应该为您提供技巧,并且是定义二元运算符的常用方法,只需添加:

friend sample operator+(const sample& a, const sample& b); //in class

sample operator+(const sample& a, const sample& b) { //outside the class
    return sample(a.x + b.x);
}
Run Code Online (Sandbox Code Playgroud)

如果你希望它仍然是一个成员(在一些罕见的场景中有缺点,并且没有上升空间),你必须使操作符成为一个const函数:

sample operator+(sample s) const; //in class

sample sample::operator+(const sample& b) const { //outside the class
    return sample(this->x + b.x);
}
Run Code Online (Sandbox Code Playgroud)

其中任何一个都允许操作员链接.你之前s = s + s1 + s2失败的原因是,它s + s1会执行并返回一个临时 sample对象.然后,它会尝试添加s2到该样本.但是,临时数只能是const参考文献[1],因此只能使用const成员函数.由于您的operator+成员函数不是const函数,因此您无法在const临时函数上使用该函数.请注意,为了实现它const,我必须重写它,因为你的版本修改了左边的对象+.

[1]有例外在这里并不特别相关,即rvalues