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

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

Если функция операция для унарной операции определена как:

  • нестатический метод, то этот метод должен быть без параметров, а тип возвращаемого объекта ссылка на объект для которого перегружаем

  • внешняя, дружественная функция, тогда соответствующая функция операция должна иметь 1 объект, а именно ссылку на объект

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

TTochka_v_pole & TTochka_v_pole:: operator – ( ) // (1) возвращать нужно ссылку на объект

{FVO [2] = - FVO [2]; // (2)

Krit_point ( ); // (3)

return *this; } // (4) конец функции операции унарный минус

Пример использовании унарной операции (унарный минус) с перегруженной операцией присваивания:

Point4 = -Point4; // (5)

Вместо оператора 5 можно применить оператор выражения, на выполнение которого будет потрачено меньше времени, но результат такой же:

-Point4; // (5’)

Определим туже унарную операцию как дружественную функцию. В этом случае функция операции должна иметь 1 объект, а именно ссылку на объект.

Прототип дружественной функции:

friend TTochka_v_pole operator – (TTochka_v_pole & P); // (6)

Определение дружественной функции вне класса:

TTochka_v_pole operator – (TTochka_v_pole & P); // (7)

{P.FVO [2] = - P/FVO [2]; // (8)

P.Krit_point ( ); // (9)

return P; // (10)

Аналогично можно перегрузить другую унарную операцию, за исключением отмеченных в вопросе 53. Мы рассмотрим только унарную операцию, которая имеет две формы. Например операцию ++. В объявлении класса в статическом поле, которое будет содержать максимально доступное количество зеленых точек.

static int Kol_point_green; // (11)

int TTochka_v_pole:: Kol_point_green = 3; // (12) внешнее определение статического поля и его инициализация

Прототип перегруженной операции «прототип ++», как метод класса:

TTochka_v_pole & operator++ ( ); // (13)

Внешнее определение:

TTochka_v_pole & TTochka_v_pole:: operator++ ( ) // (14)

{Kol_point_green+=1; // (15)

return *this; } // (16)

++Point4; // (17)

Если теперь вывести значение Kol_point_green увеличится на 1. Прежде чем привести. Отметим особые постфиксные и префиксные перегруженные операции:

  • если мы определим только префиксную операцию, то ее можно употребить в постфиксной натации

Point4++; // (17’)

Причем результат будет таким же как и в (17)

  • если мы определим постфиксную операцию, то необходимо учитывать, что она не наследуется

Если в инкриминируемой операции в обеих ее формах предполагается наращивать единицу на одну и ту же величину, то нет смысла определять две операции.

Пример, когда в префиксной и постфиксной форме значения наращиваются на разные величины, тогда постфиксную операцию можно определить так

Прототип перегруженной операции “++” как метод класса. Для того что бы выполнить правило С++ обеспечивается различимость различных вариантов перегрузки функций, постфиксную нужно объявлять с одним целым параметром

TTochka_v_pole& operator++ (int); // (18)

TTochka_v_pole & TTochka_v_pole:: operator++ (int) // (19)

{Kol_point_green+=10; // (20)

return *this; } // (21)

Теперь когда мы определили обе фрмулы вызовы в строках (17) и (17’) будут давть разные результаты.

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

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