- •Часть 2
- •Оглавление
- •Понятие класса
- •Конструкторы
- •Деструкторы
- •Поля данных и методы класса
- •Внешнее определение методов класса
- •Создание многофайлового проекта
- •Команда make и make-файлы
- •Синтаксис make-файла
- •Опции и параметры команды make
- •Зависимости
- •Правила
- •Комментарии в make-файле
- •Практическое занятие 16. Дружественные функции. Перегруженные операции. Дружественные функции
- •Перегрузка операций
- •Перегрузка операции присваивания
- •Перегрузка операции индексирования
- •Перегрузка операции вызова функции ( )
- •Создание собственных функций вставки и извлечения
- •Void exit(int код_возврата);
- •Практическое занятие 17. Функторы
- •Практическое занятие 18. Создание иерархии классов.
- •Конструкторы и деструкторы при наследовании
- •Поля и методы при наследовании
- •Операция присваивания и принцип подстановки
- •Практическое занятие 19. Динамический полиморфизм. Абстрактные классы Виртуальные методы
- •Абстрактные классы
- •Virtual тип_возврата имя_функции
- •Рекомендуемая литература
Деструкторы
Для выполнения действий, которые сопровождают удаление объекта в каждом классе явно или неявно определяется специальный метод, называемый деструктором. Имя деструктора – это имя класса, перед которым помещен символ «тильда» (~).
Форма определения деструктора:
~имя_класса()
{ операторы_деструктора}
У деструктора нет возвращаемого значения и отсутствуют параметры. Если в классе явно не определен деструктор, то компилятор встроит его определение в класс автоматически. Статус доступа у такого деструктора public.
Назначение деструктора – выполнение всех действий, сопровождающих удаление объекта. Наиболее важное – освобождение всех ресурсов, включенных в объект при его создании или выполнении действий над объектом. Такими ресурсами могут быть: участки памяти, динамически выделенной для полей объекта, файлы, открытые при создании объекта и связанные с ним, и.т.п. Однако деструкторы могут быть нужны и при уничтожении объектов, не «захвативших» никаких ресурсов. Например, перед удалением каждого объекта требуется сохранить в каком-то виде сведения об его свойствах, и это делать в программе нужно многократно и во многих местах. В этом случае удобно иметь средство, которое выполнит эту работу автоматически. Таким средством может служить специально подготовленный деструктор.
Деструктор может вызываться явно, как и другие методы класса.
Форматы вызова деструктора:
имя_объекта.~имя_класса();
имя_указателя_на_объект_класса->~имя_класса();
Деструктор вызывается без вмешательства программиста (автоматически, неявно), когда программа «покидает» блок, в котором объект класса определен как объект автоматической памяти. Кроме того, деструктор неявно вызывается в тех случаях, когда объект, размещенный в динамической памяти, удаляется с помощью операции delete.
Поля данных и методы класса
При определении класса в теле его спецификации вводятся данные (поля данных) и принадлежащие классу функции (методы).
Поля данных. Элементы класса могут быть как базовых, так и производных типов, т.е. полями данных служат переменные, массивы, указатели и т.д. Описания элементов одного типа могут быть размещены в одном предложении.
В отличие от обычного определения данных при описании элементов класса невозможна их инициализация. Это естественное свойство класса, так как при его определении еще не существует участков памяти, соответствующих его полям данных. Память выделяется не для класса, а только для объектов класса. Для инициализации полей данных должен использоваться автоматический или явно вызываемый конструктор соответствующего класса.
Существуют различия между обращениями к полям данных (и методам) класса из принадлежащих ему функций (из методов класса) и из других частей программы. Принадлежащие классу функции имеют полный доступ к его данным (и методам), т.е. для обращения к элементу класса из тела метода достаточно использовать только имя поля данных.
Для доступа к полям данных (и методам) класса из операторов, выполняемых вне его определения, непосредственное использование имен элементов недопустимо. Смысл такого запрета определяется механизмом «привязки» данных класса к конкретным объектам. Определение класса не вводит его данных, а в нем только обозначается возможность их формирования при создании конкретных объектов класса. Явно размещается в памяти не класс, а конкретный объект класса. В отведенной для объекта области памяти выделяются участки, соответствующие полям данных.
Операции, использованные для доступа к элементам класса извне:
- операция выбора элемента точка . комбинируется для доступа к элементам объекта с именем объекта или ссылкой на объект;
- операция выбора элемента стрелка -> комбинируется для доступа к элементам объекта с указателем на объект.
Данные класса не обязательно должны быть определены или описаны до (выше) их первого использования в принадлежащих классу функциях. То же самое справедливо и для методов класса, т.е. обратиться из одной функции к другой можно до ее определения внутри тела класса. Все поля данных и методы класса «видны» во всех оператора тела любой из функций класса. Именно поэтому в С++ введена особая область видимости «класс».
