Одноместные операторы типа “!”, “++”, “~” “[]”.
class clock
{
unsigned long sec;
public:
clock(unsigned long s):sec(s) { }
void tick() { sec++; }
clock operator++() { tick(); return *this; }
};
void main() { clock t(100); ++t; }
Этот класс перегружает префиксный оператор приращения ++. Перегруженный оператор представляет собой функцию-член. Перегруженный operator++() также обновляет неявную переменную clock и возвращает обновленное значение.
Префиксную операцию ++ можно перегрузить, используя friend -функцию.
frien clock operator++(clock &s1) { s1.tick(); return s1; }
Так как переменная clock должна увеличиваться мы передаем ее по ссылке. Решение о выборе между представлением friend и функцией-членом обычно зависит от того, насколько необходимы и доступны операторы неявного преобразования. Явная передача аргумента, как в friend-функции, позволяет автоматическое его приведение.
Операции инкремента и декримента могут быть перегружены как для префиксной, так и для постфиксной формы записи.
Префиксная форма объявляется как операция-член класса, которая не имеет аргументов, либо как дружественная операция, которая имеет один аргумент, представляющий собой ссылку на объект данного класса.
Постфиксная форма объявляется как операция-член класса, которая имеет один аргумент типа int, либо как дружественная операция, которая имеет два аргумента: ссылку на объект данного класса и аргумент типа int. Аргумент типа int на самом деле не используется. Фактически он имеет нулевое значение.
|
|
class X {
public:
X & operator ++(); //Префиксная форма
X & operator ++(int); // Постфиксная форма
};
class Y {
public:
friend Y & operator ++(Y &); //Префиксная форма
friend Y & operator ++(Y &,int); // Постфиксная форма
};
@x интерпретируется как x.opertor@(), если operator @ - функция-член и operator@(x), если operator @ - дружественная функция.