
- •45. Вызовы конструкторов в процессе работы программы.
- •48. Деструкторы.
- •49. Поля данных. Нестатические и статические поля – особенности их создания и инициализации. Правила обращения к полям. Константные поля.
- •50. Методы. Основные правила работы с методами. Константные методы. Статические методы.
- •51. Указатель this.
- •52. Дружественные функции и классы.
- •53. Перегрузка операций – общие положения.
- •54. Перегрузка операции присваивания. Особенности работы с ресурсоемкими объектами.
- •55. Перегрузка унарных операций.
- •56. Перегрузка бинарных операций.
- •57. Особенности определения классов с ключами struct и union.
- •58. Включение классов.
- •59. Наследование классов – общие положения.
- •Класс а
- •61. Общие особенности механизма простого наследования классов.
- •62. Множественное наследование.
- •63. Перечень специальных методов класса. Особенности определения конструкторов и деструкторов в производных классах.
- •64. Особенности определения и применения функций-операций «присваивание» в производных классах.
- •65. Особенности перегрузки операций в производных классах.
- •66. Общая характеристика виртуальных функций.
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’) будут давть разные результаты.
При необходимости перед. в тело функции объекта мы его передаем по адресу, но не по значению, тоже следует сказать о возвращении результата функции, а именно нужно возвращать не объект, а ссылку на него, этого правила нужно придерживаться. Хотя синтаксис не нарушается., но это может породить побочные эффекты, а именно неявный вызов, иногда многократно конструктор копирования, а это может противоречить логике работы алгоритма.