Язык С++ и программирование на нем. Рейзлин В.И. - 116 стр.

UptoLike

Составители: 

118
Для того, чтобы переопределить одну из стандартных операций
для работы с операндами абстрактных типов, программист должен на-
писать функцию с именем
operator ,
где обозначение этой операции (например, + | += и т.д.).
При этом в языке существует несколько ограничений:
нельзя создавать новые символы операций;
нельзя переопределять операции
:: * (– разыменование, не бинарное умножение) ?:
sizeof . .* # ##
символ унарной операции не может использоваться для переоп-
ределения бинарной операции и наоборот. Например, символ << мож-
но использовать только для бинарной операции, ! только для унарной,
а &и для унарной, и для бинарной;
переопределение операций не меняет ни их приоритетов, ни по-
рядка их выполнения (слева направо или справа налево);
при перегрузке операции компьютер не делает никаких предпо-
ложений о ее свойствах. Это означает, что если стандартная операция
+= может быть выражена через операции + и =, т.е. а + = b эквива-
лентно а = а + b, то для переопределения операций в общем случае та-
ких соотношений не существует, хотя, конечно, программист может их
обеспечить. Кроме того, не делается предположений, например, о ком-
мутативности операции +: компилятор не имеет оснований считать,
что а + b, где а и b абстрактных типов это то же самое, что и b + a;
никакая операция не может быть переопределена для операндов
стандартных типов.
Функция operator () является обычной функцией, которая может
содержать от 0 до 2 явных аргументов. Она может быть, а может и не
быть функцией-членом класса.
class cl { int i;
public:
int get () {return i;}
int operator + (int ); // Бинарный плюс.
};
int operator + (cl&, float); // Бинарный плюс.
В первой форме бинарного плюса не один, а два аргумента. Пер-
вый неявный. Его имеет любая нестатическая функция-член класса;