Перегрузка бинарных операций
Для перегрузки операций используется ключевое слово operator.Прототип перегруженной операции:
тип_возвращаемого значения operator символ оператора (операнды) { тело_функции };
Перегружать операции можно с помощью:
· функции-члена;
· функции-друга;
· глобальной функции (как правило, менее эффективно).
Можно перегружать любые операции языка С++, кроме следующих операций:
· . – операция выбора члена класса
· :: – операция разрешения области видимости
· ? : – условная операция (например, j = i>0 ? 1 : 0;)
· .* – операция разыменования указателя на член класса
· # – директива препроцессора
· sizeof
· typeid
При перегрузке операции с помощью метода класса число формальных параметров оказывается на единицу меньше числа фактических операндов операции. В этом случае первый операнд операции соответствует объекту типа класса, в котором перегружается операция. В случае бинарной операции входной параметр соответствует второму операнду перегружаемой операции.
При перегрузке операции с помощью функции-друга число формальных параметров совпадает с числом операндов операции, так как в этом случае операнды операции, представленные формальными параметрами, являются внешними объектами для такой функции.
Тип выходного параметра является встроенным типом или типом, определенным пользователем (то есть классом).
Если при перегрузке операции методом класса результатом применения операции является изменение первого (или единственного) операнда, то рекомендуется объявлять выходной параметр в виде ссылки на текущий объект. Это необходимо для оптимизации использования результата операции в других операциях, совмещенных в одном операторе, например: z = x += y;
Если при перегрузке операции функцией-членом результатом применения перегружаемой операции является вычисление значения, не изменяющего первый операнд, а также при перегрузке операции функцией-другом, выходной параметр не может быть ссылкой (если выходной параметр требуется). Это связано с тем, что вычисляемое значение помещается во временный объект, который уничтожается при завершении работы алгоритма перегруженной операции и выходе из области видимости этого временного объекта.
Перегрузка операции присваивания может быть произведена только методом классаи не может быть перегружена функцией-другом.
В отличие от операции присваивания операция ‘+=’ (и другие подобные операции) может быть перегружена как методом класса, так и функцией-другом.
Прототип перегрузки операции присваивания:
X & operator = (const X &); или X & operator = (X&);
Операцию следует перегружать функцией членом того класса, который является типом первого операнда. Если первый операнд имеет встроенный или библиотечный тип, в описание которого невозможно вставить описание дружественной функции, то такую операцию можно перегружать только функцией-другом класса, к которому относится второй операнд [8-9].
Дата добавления: 2021-07-22; просмотров: 410;