2009-03-13 4 views
1

Оператор присваивания может быть объявлена ​​какПерегрузки Арифметические операторы

Т & оператор = (Const т &);

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

ответ

2

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

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

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

4

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

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

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

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

0

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

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 делает этот процесс очень простым.

 Смежные вопросы

  • Нет связанных вопросов^_^