29
ЛАБОРАТОРНАЯ РАБОТА № 6.
ПЕРЕГРУЗКА ОПЕРАЦИЙ. ДРУЖЕСТВЕННЫЕ ФУНКЦИИ
Ключевые слова: перегрузка операторов, перегрузка по умолча-
нию,
friend-функции.
Цель: приобрести опыт перегрузки операторов для пользователь-
ских типов.
C++ позволяет переопределить действие
большинства операций
так, чтобы при использовании с объектами конкретного класса они вы-
полняли заданные функции. Эта дает возможность использовать соб-
ственные типы данных точно так же, как стандартные. Обозначения соб-
ственных операций вводить нельзя. Можно
перегружать любые опера-
ции, существующие в C++, за исключением следующих:
:: – разрешение области видимости,
. – выбор элемента класса,
.* – выбор элемента класса через указатель на элемент,
?: – условный оператор,
# – директива препроцессора,
sizeof
typeid
Перегрузка операций осуществляется с помощью методов специ-
ального вида (функций-операций) и подчиняется следующим правилам:
нельзя переопределять операторы над встроенными типами;
должно сохраняться предопределенное число аргументов операции;
Если операция унарная, то ее нельзя переопределить как бинарную
и наоборот:
нельзя изменить предопределенный приоритет операторов;
нельзя изменить синтаксические правила для выражений;
нельзя ввести новые лексемы для обозначения операций;
функции-операции не могут иметь аргументов по умолчанию;
функции-операции наследуются (за исключением =);
функции-операции не могут определяться как static;
Четыре предопределенные операции «+, –, *, &» могут использо-
ваться как бинарные, так и унарные.
Ограничения: операции
«=, (), [], ->» могут
быть переопределены
только нестатическими элементами-функциями класса.
30
Операторную функцию можно определить, как функцию-элемент,
а можно как обычную функцию. В варианте, являющемся элементом, все-
гда будет на один параметр меньше, поскольку неявно используется ука-
затель this. Целесообразно предоставлять глобальной операторной функ-
ции доступ к закрытым элементам класса, т. е.
делать ее другом этого
класса.
Функция-операция содержит ключевое слово
operator, за которым
следует знак переопределяемой операции:
тип operatorоперация (список параметров) {тело функции}
Унарная функция-операция, определяемая внутри класса, должна
быть представлена с помощью нестатического метода без параметров,
при этом операндом является вызвавший ее объект.
Операции постфиксного инкремента и декремента должны иметь
фиктивный
параметр типа int. Он используется только для того,
чтобы
отличить их от префиксной формы.
Бинарная функция-операция, определяемая внутри класса, должна
быть представлена с помощью нестатического метода с параметрами, при
этом вызвавший ее объект считается первым операндом:
Можно определить перегруженные операции вызова функции
с различным количеством аргументов.
Для операторной функции-элемента требуется, чтобы ее левый опе-
ранд был объектом ее класса. Если для операции требуется левый операнд
другого типа, то операторная функция не должна быть элементом. Если
в ней требуется доступ к необщим элементам класса, то ее нужно объявить
как друга класса. Например, перегрузка операции вывода в поток.
Достарыңызбен бөлісу: