Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++.docx
Скачиваний:
19
Добавлен:
10.06.2015
Размер:
95.05 Кб
Скачать

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)

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