Первое, что не имеет преимущества при реализации оператора как функции-члена, и в его использовании могут быть преимущества в качестве свободной функции. В частности, функция-член не симметрична по отношению к типам двух операндов, левая часть (lhs) должна быть точного типа класса, на котором она вызывается, тогда как правая часть - side (rhs) может использовать неявные преобразования. В случае операторов свободных функций одни и те же преобразования могут быть применены к lhs и rhs.
struct SomeClass {
SomeClass(int value);
bool operator<(SomeClass const &) const;
};
bool operator>(SomeClass const &, SomeClass const &);
int main() {
SomeClass x(10);
x < 100; // Fine, lhs is SomeClass
// 100 < x; // Error, no operator< can take int as lhs and SomeClass
x > 100; // Fine
100 > x; // Also fine, lhs can take the same implicit conversions
}
Обратите внимание, что основное различие здесь являются неявными преобразованиями, и что делает разницу, только если ваш тип может быть неявно преобразован из других типов. Если в ваш тип нет неявных преобразований, то этот момент будет спорным, но, учитывая, что нет недостатка в использовании бесплатной функции, и в некоторых случаях есть преимущества, я использовал бы свободные функции, когда это было возможно.
Я написал некоторое время назад о перегрузке оператора here, вы можете найти там некоторые предложения.
См. Http://stackoverflow.com/questions/4622330/operator-overloading-member-function-vs-non-member-function – dirkgently
Спасибо, думаю, я специально искал операторов сравнения и пропустил его. – smocking
[Решение между членом и нечленом] (http://stackoverflow.com/questions/4421706/operator-overloading/4421729#4421729). –