Поскольку в С++ операции, рассматриваются как функции, то очевидно, что и их можно переопределять так, что они будут работать не
только с числами, а даже с графическими объектами, строками и вообще
с чем угодно. В С++ число операций ограничено стандартным набором:
[] () . -> ++ --
& * + - ~ !
sizeof / % << >> <
> <= >= == != ^
| && ?: = *=
/= %= += -= <<= >>=
&= ^= |= , # ##
Чтобы определить операцию, необходимо определить функцию, именем
которой является специальное ключевое слово oрerator, за которым сле-
дует символ операции.
Допустим нам удалось определить тип переменных time - время, так
что появилась возможность записывать операции со временем в виде, не
разрушающем привычный формат (например: 20.04 + 05.57 = 02.01).
Переопределяемые операции
v v
time operator+(time a, time b) <
{ ^
time c; операция +
return c = a.val + b.val;
}
time work_time, busy_time, birth_time;
> вызывает переопределенную операцию
work_time = busy_time + goof_off_time;
Тип операнда определяет какую из переопределенных операций необ-
ходимо использовать.
При переопределении операции действуют следующие ограничения:
--.
вать в языке. Например, вы не можете определить операцию #.
. .* :: ?:
можно интерпретировать либо как x.операция@(), либо как опера-
ция@(x). Если описаны обе формы, то компилятор попытается раз-
решить неоднозначность путем сравнения аргументов. Аналогично,
переопределение бинарной операции @ в x@y может толковаться
либо x.операция@(y), либо операция@(x,y), и если определены
обе формы, то компилятору требуется анализировать аргументы.
Пример бинарной операции уже был: это версия операции +, для
сложения времени, где a.val + b.val интерпретируется, как:
a.val.(операция + (b.val)).