Можно объявить функции имеющие смысл для следующих операций +, -, /, %, &, |, ~, ! …Невозможно изменить синтаксис выражения и приоритет операций.
Невозможно определить унарную операцию % или бинарную !. Невозможно определить новые лексемы операций.
Бинарные и унарные операции
Бинарная операция м/б определена либо посредством функции члена класса принимающей один аргумент либо дружественной функцией принимающей два аргумента, следовательно для любой бинарной операции aa@bb может интерпретироваться либо как aa.operator@(bb) либо operator@(аа,bb) @ — бинарная операция.
Унарная операция префиксная и постфиксная может быть определена либо посредством функции члена класса без аргументов или другой функцией с одним аргументом следовательно, для любой унарной операции @ и аа@ и @аа можно интерпретировать как аа. operator@()
Пример:
Class x{
// friend…
friend x operator – (x); // унарная —
friend x operator – (x,x); // бинарный —
friend x operator – (); // ошибка, нет операндов
friend x operator – (x,х,х); // ошибка, тернарный минус
// member function (неявный аргумент this)
x*operator&();//взятие адреса, унарная
x*operator&(х);//бинарный &, «и»
x*operator&(х,х);//ошибка! Тернарная операция
}
Смысл некоторых предопределенных операций эквивалентен некоторым комбинациям др. операций для тех же самых аргументов. Например если х типа int то х++ экв-но х+=1, которое в свою очередь экв-но х=х+1. Такие соотношения не соблюдаются для операций определенных пользователем, если пользователь не определил этот путь для них явно.
