- •45. Вызовы конструкторов в процессе работы программы.
- •48. Деструкторы.
- •49. Поля данных. Нестатические и статические поля – особенности их создания и инициализации. Правила обращения к полям. Константные поля.
- •50. Методы. Основные правила работы с методами. Константные методы. Статические методы.
- •51. Указатель this.
- •52. Дружественные функции и классы.
- •53. Перегрузка операций – общие положения.
- •54. Перегрузка операции присваивания. Особенности работы с ресурсоемкими объектами.
- •55. Перегрузка унарных операций.
- •56. Перегрузка бинарных операций.
- •57. Особенности определения классов с ключами struct и union.
- •58. Включение классов.
- •59. Наследование классов – общие положения.
- •Класс а
- •61. Общие особенности механизма простого наследования классов.
- •62. Множественное наследование.
- •63. Перечень специальных методов класса. Особенности определения конструкторов и деструкторов в производных классах.
- •64. Особенности определения и применения функций-операций «присваивание» в производных классах.
- •65. Особенности перегрузки операций в производных классах.
- •66. Общая характеристика виртуальных функций.
56. Перегрузка бинарных операций.
1. в общем случае бинарные операции для объектов могут определяться как метод класса с одним параметром, либо как внешняя дружественная функция с 2-мя параметрами
2. если функция операции для операций определяется как метод класса, то выражение вида x@y // (1) означает вызов функции в виде x.operator@(y) // (2), то есть выражение (1) 1-м операндом должен быть объект, а 2-й операнд, параметр метода может иметь другой тип, который соответствует смыслу операции.
3. если функция операция для операции @ как внешняя может быть дружественная функция, то выражение (1) означает вызов в виде: operator@(x, y) // (3). При этом обязательно 1 из операторов должен быть объектом, а другой операнд может иметь любой другой тип соответствующий операции
4. если в перегруженной операции вида (1) 1-й параметр должен быть не объектом, то соответствующие функции операции могут быть только внешними дружественными функциями, но не методом класса
В других частных функциях если параметр не объект относительно к базовому типу функцию можно определить как метод класса. Среди бинарных операций особое место занимают операции присваивания. Входит в число особых выбор по индексу и по указателю. Функции операции предназначены для перегрузки.
Следует учитывать, что синтаксис и семантика перегруженных операций таковы, что они, как правило, приводят к потере исходного свойства коммутативности.
Рассмотрим пример для бинарного сложения.
Если мы имеем дело с достаточно сложными объектами, то помимо потери коммутативности могут возникнуть потери объектов данного класса.
Если складывать 2 объекта, то сложение означает суммирование только начала координат точек.
Вопрос:
Чьи поля 1-го или 2-го операнда унаследует объект результат операции.
Возможны различные решения. Мы будем полагать, что это поля 1-го объекта оперпндов. Следует учитывать, что изм. начала координат изм. знач. координ. изм. знач. точки. После начала координат можно вызвать Krit_point для пересчета.
Пункт 1
Определение «+» как метода класса с параметром объекта
TTochka_v_pole & operator+(TTochka_v_pole &); // (4)
Определяем метод вне класса:
TTochka_v_pole & TTochka_v_pole:: operator+(TTochka_v_pole & P1) // (5)
{for (int i = 0; i <3; i++) {FRO [i] += P1/FRO [i]; } // (6)
Krit_point ( ); // (7) пересчитываем траектории координат точек
return *this; } // (8)
Пример применения операции «+» как метода класса с параметром не объектом:
Прототип:
TTochka_v_pole & operator +
Определение метода вне класса:
TTochka_v_pole & TTochka_v_pole:: operator + (odn_mas A) // (11)
{for (int i =0; i < 3; i++) FRO [i] += A [i]; } // (12)
Krit_point ( ); // (13)
return *this; } // (14)
Point3 = Point4 + ARO1; // (15)
Определение операции «+» как дружественной функции с 2-мя параметрами:
Прототип функции:
friend TTochka_v_pole & operator + (TTochka_v_pole & P1, TTochka_v_pole & P2); // (16)
Определение функции вне класса:
TTochka_v_pole & operator + (TTochka_v_pole & P1, TTochka_v_pole & P2); // (17)
{for (int i = 0; i < 3; i++) {P1.FRO [i] += P2.FRO [i]; } // (18) тут подразумевается что поле P0 является общедоступным
P1.Krit_point ( ); // (19)
return P1; } // (20)
Определение функции операции «+» как дружественной функции с 1-м параметром объекта и 2-м параметром не объекта:
Прототип:
friend TTochka_v_pole & operator + (TTochka_v_pole & P1, odn_mas A); // (21)
Определение функции вне класса:
TTochka_v_pole & operator + (TTochka_v_pole & P1, odn_mas A) // (22)
{for (int i = 0; i < 3; i++) {P1.FRO [i] += a [i]; } // (23)
P1.Krit_point; // (24)
return P1; } // (25)
Рассмотрим операцию “[ ]”, которую можно определить только как метод класса:
Прототип метода:
double operator [ ] (int i); // (26)
Определение метода вне класса:
double TTochka_v_pole:: operator [ ] (int i) // (27)
{return FRO [i]; } // (28)
Пример использования этой операции:
cout << “Point3 [2] = “ << Point3 [2] << endl; // (29)