Предположим, у нас есть определение класса:
class A{
public:
int a;
A(int i): a(i){}
A operator-() const { return A(- a); } # first operator- function
};
A operator-(const A& o) { return A(- o.a); } # second operator- function
Теперь, в функции main
, если я напишу:
A a1(10);
A a2 = -a1; # Here the first operator- function (method) is called!
Однако, если я удалю первое определение оператор - в классе, вторая функция называется. Я хотел бы знать, почему компилятор предпочитает первое определение, когда они оба предоставляются.
Я также хотел бы знать, почему компилятор принимает вызов первой функции (метода). Потому что я думаю, что метод является синонимом a1-
, а не -a1
: объект, к которому применяется метод, стоит перед (слева) от оператора.