Перегрузить оператор + в обе стороны

81
03 января 2022, 18:50

Как перегрузить оператор + так, чтобы можно было складывать мой класс с другим типом в обе стороны?

Т.е. чтобы можно было сделать Myclass{} + 42 и 42 + Myclass{}.

Answer 1

Как-то так:

MyClass & operator += (MyClass &a, int b)
{
  a.value += b;
  return a;
}
MyClass operator + (MyClass a, int b)
{
  return a += b;
}
MyClass operator + (int b, MyClass a)
{
  return a += b;
}

То есть надо 2 раза определять, хоть тело одно?

Да, надо два оператора. Но в приницпе можно сделать второй таким:

MyClass operator + (int b, const MyClass &a)
{
  return a + b;
}
Answer 2

Например, если у вас MyClass имеет конструктор от int - просто определить как свободный (вне класса) оператор

... operator+(const MyClass&,const MyClass&);

Тогда при суммировании просто выполнится неявное преобразование int в MyClass.

Можно - определить два оператора

... operator+(const MyClass&, int);
... operator+(int,const MyClass&);

Первый из них можно определить и как член, и как свободный; второй - только как свободный оператор.

P.S. Как правило, стоит определять сразу же и оператор +=, причем один вполне может определяться через другой...

Answer 3
  1. Прямой ответ: написать отдельные перегруженные операторы для всех возможных комбинаций операндов MyClass + int и int + MyClass.

  2. Однако, если семантика вашего класса такова, что он натуральным образом поддерживает сложение MyClass + MyClass и также неявное преобразование int -> MyClass (то есть не-explicit конструктор преобразования из типа int), то оператор MyClass + MyClass уже сам по себе будет "покрывать" и сложения MyClass + int и int + MyClass тоже:

    struct MyClass 
    {
      MyClass() = default;
      MyClass(int) {}
      friend MyClass operator +(const MyClass &, const MyClass &)
        { return MyClass(); }
    };
    int main()
    {
      MyClass a;
      a + 123;
      123 + a;
    }
    

    Именно для "симметричности" поведения класса в таких контекстах и рекомендуется реализовывать оператор + отдельностоящей функцией, а не методом класса.

READ ALSO
Количество знаков после запятой c++

Количество знаков после запятой c++

Нужно вывести результат деления двух чисел с точностью до 10^-9

100
Алгоритмы и структуры данных (задача на c++) [закрыт]

Алгоритмы и структуры данных (задача на c++) [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

219
Замена всех пустых мест в строке

Замена всех пустых мест в строке

Я получаю от пользователя две строки, потом проверяю первую на некоторые символы -> удаляю эти символыТут проблем нет

98