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

Имеется ограничение в языках С и С++, накладываемое на операции над известными типами данных (классами) char, int, float и т.д.:

char c,

int i,j;

double d,k;

В С и С++ определены множества операций над объектами c,i,j,d,k этих классов, выражаемых через операторы: i+j, j/k, d*(i+j). Большинство операторов (операций) в С++ может быть перегружено (переопределено), в результате чего расширяется диапазон применения этих операций. Когда оператор перегружен, ни одно из его начальных значений не теряет смысла. Просто для некоторого класса объектов определен новый оператор (операция). Для перегрузки (доопределения) оператора разрабатываются функции, являющиеся либо компонентами, либо friend-функциями того класса, для которого они используются. Остановимся на перегрузке пока только с использованием компонент- функций класса.

Для того чтобы перегрузить оператор, требуется определить действие этого оператора внутри класса. Общая форма записи функции-оператора, являющейся компонентой класса, имеет вид

тип_возвр_значения имя_класса :: operator #(список аргументов)

{ действия, выполняемые применительно к классу

};

Вместо символа # ставится значок перегружаемого оператора.

Следует отметить, что нельзя перегрузить триадный оператор «?:.», оператор «sizeof» и оператор разрешения контекста «::».

Функция operator должна быть либо компонентой класса, либо иметь хотя бы один аргумент типа «объект класса» (за исключением перегрузки операторов new и delete). Это позволит доопределить свойства операции, а не изменить их. При этом новое значение оператора будет иметь силу только для типов данных, определенных пользователем; для других выражений, использующих операнды стандартных типов, значение оператора останется прежним.

Выражение a#b, имеющее первый операнд а стандартного типа данных, не может быть переопределено функцией operator, являющейся компонентом класса. Например, выражениие a−4 может быть представлено как a.operator−(4), где а – объект некоторого типа. Выражение вида 4−a нельзя представить в виде 4.operator(a). Это может быть реализовано с использованием глобальных функций operator.

Функция operator может быть вызвана так же, как и любая другая функция. Использование операции – лишь сокращенная форма вызова функции. Например, запись вида a=в−с эквивалентна a=operator−(b,с).

В заключение отметим основные правила доопределения операторов:

- все операторы языка С++, за исключением . :: ?: sizeof и символов # ##, можно доопределять;

- при вызове функции operator используется механизм перегрузки функций;

- количество операндов, которыми оперируют операторы (унарные, бинарные), и приоритет операций сохраняются и для доопределенных операторов.