Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
7
Добавлен:
25.04.2019
Размер:
1.34 Mб
Скачать

6.3. Перегрузка бинарных операций

Всякую стандартную бинарную операцию @, подлежащую перегрузке, можно перегрузить, определив либо компонентную функцию класса с одним параметром, либо глобальную (возможно, дружественную) функцию с двумя параметрами. При перегрузке бинарных операций глобальными функциями допускается, чтобы только один из двух их параметров был связан с требуемым классом. Для компонентных функций-операций вообще разрешается отсутствие связи параметра с классом, на который выполняется перегрузка.

Форматы заголовков функций-операций для перегрузки стандартных бинарных операций будут следующими:

Value_type operator @ (parameter); // компонентная функция

Value_type operator @ (parameter, parameter); // глобальная функция friend value_type operator @ (parameter, parameter); // дружественная функция

Если функция-операция определена как компонентная функция класса C, то запись x@y (где как минимум x – объект класса C) будет интерпретирована как x.operator@(y). Если же используется глобальная функция-операция, то имеет место интерпретация operator@(x,y) (здесь как минимум x или y – объекты класса C). Следует отметить, что не все бинарные операции допускают применение при их перегрузке любого из приведенных форматов. Например, ни операция индексации operator[], ни операция присваивания operator= не могут быть реализованы глобальными функциями. Напротив, операции operator>> и operator<< нельзя реализовать компонентными функциями.

Теперь остановимся на особенностях перегрузки некоторых из бинарных операций.

Наибольшее число потенциальных проблем заключает в себе перегрузка операций присваивания и, в частности, operator =.

Первой особенностью этой операции является то, что она входит в число тех операций, для которых компилятор автоматически генерирует соответствующие функции-операции в каждом пользовательском классе. То есть если явно не ввести подобную функцию в класс, она будет введена неявно. Во многих случаях поведение такой автоматически генерируемой функции не удовлетворяет условиям решаемой задачи и необходимо ее непосредственное определение.

Вторая проблема состоит в том, что перегрузка операции = не означает автоматической перегрузки других операций присваивания, например, operator += или operator *=, даже если перегружены операции сложения и умножения. Для перегрузки этих операций требуется введение отдельных функций-операций.

Третья заключается в выборе правильного способа определения функции operator =. Согласно стандарту, эта функция должна определяться только как нестатическая компонентная функция класса с одним параметром. Для обеспечения ее корректного поведения возвращаемое значение должно определяться как ссылка на класс, а оператор return должен возвращать значение *this. Ниже приведен заголовок внешнего определения корректно определенной функции operator = для некоторого класса C:

C & C::operator = (parameter);

В качестве параметра может выступать ссылка на класс C или параметр любого другого типа, для которого предполагается разрешить присваивание. Ниже даны эскизы версий этой функции для класса CString, моделирующего строки:

CString & CString::operator = (const CString & strSourceString) {

...

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]