Унарный оператор, префиксный или постфиксный, можно определить либо в виде нестатической функции-члена без аргументов, либо в виде функции-не-члена с одним аргументом. Для любого унарного оператора @ выражение @aa интерпретируется либо как aa.operator@(), либо operator@(aa). Если определены обе функции, то для выяснения того, какую (возможно никакую) из них использовать, применяется механизм разрешения перегрузки. Для любого постфиксного унарного оператора @ выражение aa@ интерпретируется либо как aa.operator@(int), либо operator@(aa, int). Если определены обе функции, то для выяснения того, какую (возможно ника-кую) из них использовать, применяется механизм разрешения перегрузки.
Оператор может быть объявлен только с синтаксисом, существующим для него в грамматике, то есть пользователь не может определить унарный % или + с тремя операндами. Например:
class X
{
// префиксный унарный оператор & (адрес)
X* operator&();
X operator&(X); //бинарный оператор & (и)
X operator++(int); //постфиксный инкремент
X operator&(X, X, X); //ошибка: три операнда
X operator/(); //ошибка: унарный оператор /
};
X operator-(X); //префиксный унарный минус
X operator-(X, X); //бинарный минус
X operator--(X&, int);//постфиксный декремент
X operator-(); //ошибка: отсутствует операнд
X operator-(X, X, X); //ошибка: три операнда
X operator%(X); //ошибка: унарный оператор %
Перечисления являются типами, определяемыми пользователем, поэтому мы можем ввести для них операторы. Например:
enum Day{sun, mon, tue, wed, thu, fri, sat};
Day& operator++(Day& d)
{ return d = (sat == d) ? sun : Day(d+1); }
|