Перегруженный оператор присваивания в С++ для двух или более двух объектов?

Я перегрузил оператор +, как этот

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;    
}

Это правильно? Мой вопрос: если я хочу добавить два разных объекта-образца, как я перегружаю opeartor; например, для s = s1 + s2;

Мне нравится делать s = s + s1 + s2 с существующей реализацией.

Ответ 1

Использование перегрузки оператора-друга должно сделать трюк для вас и является обычным способом определения двоичных операторов, просто добавьте:

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);
}

Если вы хотите, чтобы он оставался участником (который имеет недостатки в некоторых редких сценариях и без него), вы должны сделать оператор функцией const:

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

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

Любой из них позволит цепочку операторов. Причина, по которой произошел предыдущий s = s + s1 + s2, заключается в том, что s + s1 выполнит и вернет временный объект sample. Затем он попытается добавить s2 к этому образцу. Тем не менее, временные файлы могут быть const ссылками [1] и поэтому могут использовать только функции-члены const. Поскольку ваша функция-член operator+ не является функцией const, вы не можете использовать эту функцию в const временную. Обратите внимание, что для этого const мне пришлось переписать его, так как ваша версия изменяет объект в левой части +.

[1] с исключениями здесь не особо важны, а именно rvalues ​​