2016-11-03 2 views
9
class A { 
public: 
    string operator+(const A& rhs) { 
     return "this and A&"; 
    } 
}; 

string operator+(const A& lhs, const A& rhs) { 
    return "A& and A&"; 
} 

string operator-(const A& lhs, const A& rhs) { 
    return "A& and A&"; 
} 

int main() { 
    A a; 
    cout << "a+a = " << a + a << endl; 
    cout << "a-a = " << a - a << endl; 
    return 0; 
} 

//output 
a+a = this and A& 
a-a = A& and A& 

Мне любопытно, почему оператор внутри класса получает вызов, а не внешний. Есть ли какой-то приоритет среди операторов?Как работает оператор внутри класса?

+4

Процесс выбора между несколькими функциями с тем же именем называется * разрешением перегрузки *. В этом коде член является предпочтительным, потому что не-член требует преобразования квалификации (добавление 'const' в' lhs'), но член этого не делает. Если вы сделали функцию-член 'const' (которую вы должны, так как она не изменит' * this'), тогда это будет неоднозначно. –

ответ

4

Процесс выбора среди нескольких функций одного и того же именем называется разрешениемперегрузки. В этом коде член является предпочтительным, потому что член, не являющийся членом, требует преобразования квалификации (добавление const к lhs), но член этого не делает. Если вы сделали функцию-член const (которую вы должны, так как она не изменяет *this), тогда это будет неоднозначно.

1

Всякий раз, когда ваш объект не является константой, существует приоритет неконстантности над константой. Внутренняя будет вызываться, когда левая сторона не является константой, а внешняя будет вызываться, когда левая сторона будет const.

Посмотрите, что происходит, когда внутренний определяется как:

string operator+(const A& rhs) const;

+1

«Существует приоритет неконстантности над константой». Не в общем случае. Если 'a' был объявлен как' const A a; ', будет использоваться перегрузка вне класса. – Angew

+0

Вот что я написал. – Shloim

+1

Способ написания ответа «есть приоритет неконстантности над константой» звучит как общее утверждение. Конечно, это было бы неправильно. – Angew