Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections_rus.doc
Скачиваний:
31
Добавлен:
06.02.2016
Размер:
1.41 Mб
Скачать

3.3. Использование деструкторов

Деструктор решает задачу, обратную задаче конструктора. Деструктор (destruct - разрушать) - это специальная функция-член класса. Имя деструктора состоит из символа тильда (~) и имени класса.

Пример деструктора:

~my_Time()

{ // тело деструктора

}

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

class MyClass{

public:

int *x;

MyClass(){x=new int;}

~MyClass(){ delete x;}

};

Деструктор не принимает никаких параметров и не возвращает никаких значений. Класс может иметь только один деструктор.

Типичная ошибка программирования.Попытки передать аргументы деструктору, вернуть значение из деструктора.

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

Когда вызываются конструкторы и деструкторы.

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

  1. Если объект определен глобально(т.е. вне любой функции), то конструктор вызывается в самом начале программы до вызова функции main), деструктор - по окончании программы.

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

  3. Если объект определен локально с использованием спецификатораstatic, конструктор вызывается сразу же, как только процесс выполнения впервые достигает места, где объект был объявлен, деструктор - в конце программы.

Пример программы показывает последовательность, в которой вызываются конструкторы и деструкторы объектов типа CreateAndDestroyв разных областях видимости. Объектfirst является глобальным объектом, его конструктор вызывается, как только программа начинает выполнение, а его деструктор вызывается по завершении программы, после того, как все другие объекты уничтожены.

В функции mainобъявлено три объекта. Объектыsecond иfourthявляются локальными объектами, а объектthirdобъявлен с классом памятиstatic. Конструкторы каждого из этих объектов вызываются, когда процесс выполнения достигает места, где объекты были объявлены. Деструкторы объектовfourthиsecondвызываются в соответствующем порядке, когда заканчиваетсяmain. Поскольку объект third- статический, то он существует до завершения программы. Деструктор объектаthirdвызывается раньше деструктора дляfirst, но после уничтожения всех других объектов.

Функция createобъявляет три объекта - локальные объектыfifthиseventhи статический локальный объектsixth. Деструкторы для объектовseventhиfifthвызываются в соответствующем порядке по окончанииcreate. Посколькуsixth- статический объект, он существует до завершения программы. Деструктор дляsixthвызывается раньше деструктора дляthird и first, но после уничтожения всех других объектов.

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