Если бинарный оператор перегружается с помощью функции-члена, то в качестве своего первого аргумента он получает неявно переданную переменную класса, а второго - единственный из списка аргументов. При объявлении friend -функции или обычной функции в списке параметров определяют оба аргумента.
class clock {
friend clock operator+(const clock &c1,const clock &c2);
};
clock operator+(const clock &c1,const clock &c2) {
clock temp(c1.sec+c2.sec); return temp;
}
Оба параметра явно определяются и являются кандидатами для преобразования назначением. Используя это определение имеем:
int i=5; clock c(100);
c+i; // допустимо: i - преобразуется в clock
i+c; // допустимо: i - преобразуется в clock
В противоположность этому, перегрузим двухместный - функцией-членом.
class clock {
clock operator -(const clock &c) { clock temp(sec-c.sec); return temp; }
};
Существует первый неявный аргумент. В него попадает некоторый используемый параметр. Это может вызвать асимметричное поведение двухместных операторов.
int i=5; clock c(100);
c-i; // допустимо i преобразуется в clock; c.operator-(i)
i-c; // недопустимо i не относится к типу clock; i.operator-(c)
|
|
Определим операцию умножения: long и clock
clock operator *(long m, const clock &c) {
clock temp(m*c.sec); return temp;
Такая реализация вынуждает операцию умножения иметь фиксированный порядок выполнения, зависящий от типа. Для избежания этого обычно пишется второй перегруженный функциональный оператор.
clock operator *(const clock &c,long m) {
clock temp(m*c.sec); return temp;
}
y@x интерпретируется как y.opertor@(x), если operator @ - функция-член и operator@(y,x), если operator @ - дружественная функция.
Операция вызова функции
Операция вызова функции должна быть объявлена как нестатическая функция-член класса. Она позволяет пользователю определять число операндов.
class X {
int a,b,c;
public:
X(int a1, int b1, int c1): a(a1),b(b1),c(c1) {}
void operator() { int i,int j, int k);
};
X ex(8,20,17); // Вызывается конструктор
ex(10,15,57); // Вызывается операция ()