Перегрузка арифметических операторов - PullRequest
1 голос
/ 13 марта 2009

Оператор присваивания может быть объявлен как

T & operator = (const t &);

в классе, но арифметические операторы не могут быть определены таким образом. Это должна быть функция друга. Я не понимаю почему? Не могли бы вы объяснить?

Ответы [ 4 ]

4 голосов
/ 13 марта 2009

Арифметические операторы не обязательно должны быть друзьями

Ну, вы можете определить так:

MyClass MyClass::operator + (const MyClass& t) const
{
  MyClass ret(*this);
  ret += t;
  return ret;
}

a + b действительно синтаксический сахар, компилятор расширит его до a.operator+(b). Предыдущий пример будет работать, если все ваши объекты являются экземплярами MyClass, но не будет работать, если вам придется работать с другими типами, например 1 + a, не будет работать, это можно решить с помощью друзей.

MyClass operator + (int i, const MyClass& t)
{
  MyClass ret(i);
  ret += t;
  return ret;
}

Это должно быть сделано, когда левая часть оператора + не является классом, или это класс, но вы не можете добавить оператор + к его определению.

2 голосов
/ 13 марта 2009

Я думаю, что C ++ FAQ Lite даст вам окончательный ответ.

2 голосов
/ 13 марта 2009

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

yourtype v = 1;
yourtype w = 1 + v;

Так как 1 не является объектом yourtype, если бы operator+ был членом, он бы выбрал. Однако, делая его глобальным, он преобразует 1 в yourtype и затем выполняет операцию. Создание друга помогает извлекать и манипулировать членами yourtype по мере необходимости, но не обязательно. Как пример: Вы можете реализовать функцию-член operator+= и использовать ее в реализации operator+.

0 голосов
/ 13 марта 2009

Проблема в том, что если вы делаете что-то вроде этого:

class A
{
    A& operator+(int n);
    // ...
}

int main()
{
    A my_var;
    int integer = 1;
    A + integer; // compiles
    integer + A // error: no function operator+(int, A) defined
}

не скомпилируется. Решение состоит в том, чтобы определить оператор + (int, A) и оператор + (A, int) как друзей A. Как примечание, библиотека Boost Operators делает этот процесс очень простым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...