Бинарный оператор можно определить либо в виде нестатической функции-члена с одним аргументом, либо в виде функции-не-члена с двумя аргументами. Для любого бинарного оператора @ выражение aa@bb интерпретируется либо как aa .operator@(bb), либо operator@(aa, bb). Если определены обе функции, то для выяснения того, какую (возможно никакую) из них использовать, применяется механизм разрешения перегрузки. Например:
class X
{
public:
void operator+(int);
X(int);
};
void operator+(X, X);
void operator+(X, double);
void f(X a)
{
a+1; // a .operator+(1)
1+a; // ::operator+(X(1), a)
a+1.0; // ::operator+(a, 1.0)
}
|