Как правильно определить унарный оператор - в C ++ - PullRequest
0 голосов
/ 24 января 2020

Предположим, у нас есть определение класса:

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: объект, к которому применяется метод, стоит перед (слева) от оператора.

1 Ответ

3 голосов
/ 24 января 2020

Из стандарта C ++ , унарный оператор минус должен быть определен следующим образом:

T T::operator-() const;

внутри определения класса и так:

T operator-(const T &a);

снаружи определение класса.

Теперь у вас есть оба типа определений в вашем классе, поэтому поиск членов вступает в игру, как указано здесь :

два отдельных поиска выполняются: для перегрузок операторов, не являющихся членами, и для перегрузок операторов-членов (для операторов, где разрешены обе формы). Эти наборы затем объединяются со встроенными перегрузками оператора на равных основаниях, как описано в разрешении перегрузки. Если используется явный синтаксис вызова функции, выполняется обычный поиск по неквалифицированным именам

Так что, в основном, поиск членов находит A operator-() const;, поиск не членов ищет A operator-(const A& o);. Разрешение перегрузки выбирает A operator-() const;.

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