Это не обязательно различие между friend
перегрузками операторов и перегрузками операторов функций-членов, поскольку это между глобальными перегрузками операторов и перегрузками операторов функций-членов.
Одна из причин, по которой предпочтение отдается глобальной перегрузке оператора, заключается в том, что вы хотите разрешить выражения, в которых тип класса отображается с правой стороны бинарного оператора. Например:
Foo f = 100;
int x = 10;
cout << x + f;
Это работает, только если есть глобальная перегрузка оператора для
оператор Foo + (int x, const Foo & f);
Обратите внимание, что глобальная перегрузка оператора не обязательно должна быть функцией friend
. Это необходимо, только если ему нужен доступ к закрытым членам Foo
, но это не всегда так.
Независимо от того, если бы Foo
имел только перегрузку оператора функции-члена, например:
class Foo
{
...
Foo operator + (int x);
...
};
... тогда у нас будут только те выражения, где экземпляр Foo
появляется в слева оператора плюс.