Может ли быть ситуация, когда синтаксис
if (first == second) // ...
отличается от этого?
if (first.operator==(second)) // ...
Я так не думаю, но просто хочу это знать.
a == b
иногда эквивалентно
a.operator==(b)
а иногда эквивалентно
operator==(a,b)
и иногда эквивалентно ни одному, если значение в конечном итоге является «встроенным» значением ==
для неклассных типов.
Всякий раз, когда компилятор видит ==
, если хотя бы один тип включает определенный пользователем тип, он ищет операторы-члены (не должен быть скрыт в области действия a
Тип класса) и операторы, не являющиеся членами (с использованием поиска, зависящего от аргумента) и встроенные значения (поскольку класс может иметь неявное преобразование в обычный тип со встроенным сравнением). Если более чем один может иметь смысл, это идет к правилам для разрешения перегрузки.
Если вы имеете в виду «когда два синтаксиса не эквивалентны», то ответ будет, когда оператор равенства не является членом какого-либо типа first
является. Очевидно, что второй вариант не будет работать для типов без члена operator==
, Это включает в себя встроенные типы.
Когда оператор-член существует для типа first
, тогда они различаются, потому что оператор, не являющийся членом, может разрешать преобразования типов для обоих first
а также second
в то время как пример с оператором-членом может разрешить преобразование только для second
,
Одним из примеров ситуации, в которой два оператора имеют разные эффекты, является то, что вы имеете неявные преобразования first
, Например:
struct my_int
{
int num;
my_int(int num) : num(num) {}
};
bool operator==(const my_int& a, const my_int& b)
{
return a.num == b.num;
}
В этом случае следующий допустимый код C ++:
my_int a(1);
int x = 1;
if (x == a) {
std::cout << "Equal\n";
}
Где компилировать этот код:
my_int a(1);
int x = 1;
if (x.operator==(a)) {
std::cout << "Equal\n";
}
Выдает ошибку компиляции, как показано ниже:
translation.cpp: в функции int main (): translation.cpp: 21: 16: ошибка:
запрос на член ‘operator ==’ в ‘x’, который не относится к классу
«INT»
Второй не будет работать с примитивами. Однако обе формы будут работать с пользовательскими типами, у которых этот оператор публично перегружен.
Если ваш вопрос основан только на синтаксисе, то это зависит от типа параметров. Рассмотрим следующий код:
#include <iostream>
using namespace std;
class a {public:
a(){
}
int operator ==(const a& v){
cout << "member operator" << endl;
return false;
}
};
int operator ==(a &v1, a &v2){
cout << "external operator" << endl;
return true;
}int main(){
a a1, a2;
if (a1 == a2 && a1.operator==((const a&)a2)) {
cout << "done" << endl;
}
}
В этой настройке вызываются оба оператора.
Если параметры типа функции совпадают, кажется, что метод будет предпочтительным.