Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мини конспект по ООП.doc
Скачиваний:
34
Добавлен:
25.03.2015
Размер:
241.66 Кб
Скачать

14. Деструктор. Вызов деструкторов (автоматический и явный).

Деструктор – это особый вид метода, применяющийся для освобождения памяти, занимаемой объектом.

Деструктор имеет то же имя, что и класс, в котором он объявляется, с префиксом тильда (~).

Например:

monstr::~monstr()

{

delete [ ] name;

}

Деструктор вызывается автоматически, когда объект выходит из области видимости:

– для глобальных объектов – как часть процедуры выхода из функции main;

– для локальных объектов – при выходе из блока, в котором они объявлены;

– для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete.

Автоматический вызов деструктора не производитсяпри выходе из области действия указателя на него.

Деструктор объявляется явно, когда объект содержит указатели на память, выделяемую динамически – иначе при уничтожении объекта память, на которую ссылались поля-указатели, не будет помечена как свободная.

Например, при указании полностью уточненного имени деструктор будет иметь вид:

monstr *m;

m->~monstr();

Явное определение деструктора может понадобиться для объектов, которым с помощью операции newбыл выделен конкретный адрес памяти.

Без необходимости явно вызывать деструктор объекта не рекомендуется.

Нельзя определить указатель на деструктор.

15. Основные свойства и правила использования деструкторов.

Основные свойства и правила использования деструкторов:

– класс может иметь только один деструктор;

– деструктор имеет то же имя, что и класс, в котором он объявляется, с префиксом тильда (~);

– деструктор не имеет параметров (аргументов);

– деструктор не возвращает значения (даже типа void);

– конструкторы нельзя объявлять как constилиstatic;

– деструктор не наследуется в производных классах. Но производный класс может вызывать деструкторы для его базовых (родительских) классов;

– деструктор – это функция, и он может быть виртуальным (его можно объявить с ключевым словом virtual);

– в программе невозможно получить адрес деструктора (указатель на деструктор);

– если деструктор не задан в программе, он будет автоматически сгенерирован компилятором для уничтожения соответствующих объектов. Все деструкторы, сгенерированные таким образом, имеют атрибут public;

– деструктор можно вызвать так же, как обычную функцию, если использовать его полное имя. Например, Х*р; ... р->Х::Х()

– деструктор вызывается автоматически только разрушении (уничтожении) объекта;

– объект, содержащий деструктор, нельзя включить в виде компонента в объединение (union);

– при вызове библиотечной функции exit вызываются деструкторы только для глобальных объектов;

– при вызове библиотечной функции abort никакие деструкторы не вызываются;

– если память под объект выделена через указатель с помощью оператора new, то при прекращении существования этого указателя объект автоматически не разрушается. Для разрушения объекта в программе надо использовать оператор delete.

16. Создание и уничтожение объектов.

Для создания объекта класса вызывается конструктор, для разрушения (уничтожения) объекта – деструктор. Каждый объект имеет некоторое время существования. Это время определяется тем, где (в какой области памяти) и как (каким способом) создан объект. Объекты могут быть созданы в следующих формах:

глобальные объекты– последовательность их создания определяется последовательностью их объявления. Разрушение объектов производится в обратном порядке.

локальные (автоматические) объекты– последовательность их создания определяется последовательностью их объявления. Разрушение объектов производится в обратном порядке.

статические объекты:

Глобальные статические объектыконструируются в порядке их объявления в начале выполнения программы и разрушаются в обратном порядке при завершении программы.

Локальные статические объектыконструируются один раз при первом их описании и разрушаются при завершении программы.

Если программа завершается вызовом функции exit(), то деструкторы для сконструированных ранее объектов будут вызваны. Но если программа завершается вызовом функции abort(), деструкторы не будут вызваны.

объекты в динамически выделяемой области памяти – если объект сконструирован с помощью встроенного оператора для динамического выделения памяти new, то он должен быть разрушен явно с помощью встроенного оператора для динамического освобождения памяти delete.

объекты-компоненты классов– при их создании конструктор объекта, являющегося компонентом другого класса, вызывается при вызове конструктора класса, в котором этот объект объявлен. Конструкторы для нескольких объектов-компонентов вызываются в порядке их объявления перед конструктором класса, в котором они объявлены. Все деструкторы вызываются в обратном порядке.

объекты-элементы массивов– создаются при создании массива объектов одного типа. Причем хотя бы один из конструкторов этих объектов должен иметь параметры, заданные по умолчанию, так как при объявлении массива объектов невозможно определить параметры для конструкторов этих объектов и единственная возможность вызова конструкторов – это передача им параметров, заданных по умолчанию.

Конструкторы и деструкторы для массива объектов вызываются по правилам построения и разрушения объектов в определенной области памяти: глобальная память, локальная память, статическая память, динамическая память, объекты-компоненты другого класса (см. выше).