- •4.1. Общие сведения о перегрузке операторов
- •4.2. Общие особенности перегрузки бинарных и унарных операторов
- •Бинарные операторы
- •Унарные префиксные операторы
- •Унарные постфиксные операторы
- •Правила выбора места определения операторных функций
- •4.3. Перегрузка основных унарных операторов
- •Операторы префиксного и постфиксного инкрементов и декрементов
- •Операторы унарного плюса и минуса
- •Операторы преобразования типа
- •4.4. перегрузка основных бинарных операторов
- •Оператор присваивания
- •Составные операторы присваивания
- •Обычные арифметические и логические операторы
- •Операторы ввода и вывода
- •Оператор индексации
- •Оператор вызова функции
Лекция 4. ПЕРЕГРУЗКА ОПЕРАТОРОВ ДЛЯ ОБЪЕКТОВ КЛАССОВ
После определения объектов-членов и функций-членов класса довольно часто возникает |
|
||||||||
необходимость в определении на множестве его объектов некоторых операторов. Для их |
|
||||||||
обозначения программисту разрешается использовать ряд операторов языкаC++. Т. о., один |
|
||||||||
и тот же оператор может быть применен для обозначения операций, определенных над |
|
||||||||
объектами различных классов. Такое свойство |
языкаC++ называется |
перегрузкой |
|
||||||
операторов. |
|
|
|
|
|
|
|
|
|
Вообще |
термин «перегрузка» в программировании |
применяется |
к |
|
функциям. Он |
|
|||
обозначает механизм, позволяющий в пределах общей области видимости определять более |
|
||||||||
одной функции с одним и тем же именем, но отличающихся типом возвращаемого |
|
||||||||
результата и/или типами и количеством формальных аргументов. Такие |
одноименные |
|
|||||||
функции |
называются |
перегруженными. Запрещается |
наличие |
двух |
функций |
с |
|||
эквивалентными заголовками. Примеры прототипов перегруженных функций: |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
||
// перегруженные функции OverloadedExample1() : |
|
|
|
|
|
|
|
||
int OverloadedExample1(const int p1, const double d2); //(1) |
|
|
|
|
|
|
|||
int OverloadedExample1(const int p); |
//(2) |
|
|
|
|
|
|
||
void OverloadedExample1(int * pp1, const double d2); |
//(3) |
|
|
|
|
|
|
||
// неразрешенные варианты перегрузки: |
|
|
|
|
|
|
|
||
//int OverloadedExample1(const int R); |
//(4) |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
||
//int OverloadedExample1(const int R0, int u1 = 0); |
//(5) |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
Варианты (1)–(3) – допустимы, т. к. отличаются составом и/или количеством формальных аргументов. Кроме того, вариант (3) отличается от двух первых типом возвращаемого результата. Вариант (4) недопустим, т. к. полностью совпадает с вариантом(2); разница в имени формального аргумента не имеет значения. Вариант (5) вызовет неоднозначность в случае попытки вызова с одним фактическим аргументом, т.к. при этом возможен и вызов функции (2).
Применительно к операторам, определяемым для объектов класса, термин перегрузка означает то же самое, т.к. подразумевает создание для каждого перегружаемого в классе оператора одной или нескольких специальных операторных функций, имена которых будут совпадать с уже имеющимися (например, встроенными в C++) операторными функциями для других типов операндов.
4.1.Общие сведения о перегрузке операторов
Вкачестве обозначений операторов над объектами классов разрешается использовать следующие обозначения операторов языка C++:
Некоторые операторы, которые не могут быть перегружены в классах:
Программист не имеет возможности изменения приоритета перегруженного оператора в выражениях. Кроме того, нельзя изменять предопределенное число операндов для конкретного оператора. Так, например, оператор инкремента может быть лишь унарным.