Перегрузка унарного оператора

Одноместные операторы типа “!”, “++”, “~” “[]”.

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 @ - дружественная функция.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: