Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

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

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

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

~my_Time()

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

}

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

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

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

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

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

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

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

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

Если объект определен локально с использованием спецификатора 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, но после уничтожения всех других объектов.

Программа

/* Демонстрация последовательности, в которой вызываются

конструкторы и деструкторы. */

#include<iostream.h>

// описание класса CreateAndDestroy

class CreateAndDestroy

{

public:

CreateAndDestroy(int value) // конструктор

{

data = value;

cout << " Object " << data << " constructor";

}

~CreateAndDestroy() // деструктор

{

cout << " Object " << data << " destructor" << endl;

}

private:

int data;

};

CreateAndDestroy first(1); // глобальный объект

void create(void); //прототип функции

void main ()

{

cout << "\t(global object) " << endl;

CreateAndDestroy second(2); // локальный объект

cout << "\t(local auto object in main) " << endl;

static CreateAndDestroy third(3); // статический объект

cout << "\t(local static object in main) " << endl;

create(); // вызов функции создания объектов

CreateAndDestroy fourth(4); // локальный объект

cout << "\t(local auto object in main) " << endl;

}

// Функция создания объектов

void create(void)

{

CreateAndDestroy fifth(5); // локальный объект

cout << "\t(local auto object in create) " << endl;

static CreateAndDestroy sixth(6); // статический объект

cout << "\t(local static object in create) " << endl;

CreateAndDestroy seventh(7); // локальный объект

cout << "\t(local auto object in create) " << endl;

}

Результаты выполнения программы

Object 1 constructor (global object)

Object 2 constructor (local auto object in main)

Object 3 constructor (local static object in main)

Object 5 constructor (local auto object in create)

Object 6 constructor (local static object in create)

Object 7 constructor (local auto object in create)

Object 7 destructor

Object 5 destructor

Object 4 constructor (local auto object in main)

Object 4 destructor

Object 2 destructor

Object 6 destructor

Object 3 destructor

Object 1 destructor