Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Козак Н.В. Лекции Основы создания программ в Си...doc
Скачиваний:
24
Добавлен:
23.09.2019
Размер:
2.24 Mб
Скачать

Деструктор

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

Именем деструктора должно быть имя класса, которому предшествует тильда (~). Свойства деструкторов таковы:

  1. Деструктор не имеет параметров.

  2. Он не может возвращать значений.

  3. Деструктор не наследуется.

  4. Деструктор не может объявляться как static, const или volatile.

  5. Деструктор может быть объявлен виртуальным.

Операции класса new и delete

Класс может определять свои собственные операции new и delete (new[] и delete [] для массива объектов):

  • Функция имя_класса:: operator new() вызывается при создании динамических объектов.

  • Функция имя_класса:: operator new [] () вызывается при создании динамических массивов объектов.

  • Функция имя_класса:: operator delete () вызывается при удалении динамических объектов.

  • Функция имя_класса:: operator delete []() вызывается при удалении динамических массивов.

Ниже приведен довольно длинный пример, демонстрирующий определение операций класса new и delete, а также глобальных new[] и delete []. Вывод программы позволяет проследить порядок вызовов конструкторов/деструкторов и операций new/delete при создании автоматических и динамических объектов.

// NewDel.cpp: Операции класса new и delete.

// ' •

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#define trace (msg) printf(#msg "\n")

#define MaxStr 32

void *operator new[](size_t size) // Замена глобальной new[].

{

trace (Global new[].);

return malloc(size);

}

void operator delete[](void *p) // Замена глобальной delete[].

{

trace (Global delete[].);

free(p);

}

class Hold

{

char *str; // Закрытый указатель на строку,

public:

Hold(const char*);

~Hold();

void *operator new(size_t); // Операция new класса.

void operator delete(void*); // Операция delete класса.

void show(void)

{ printf("%s\n", str); }

};

Hold::Hold (const char *s) // Конструктор.

{

trace (Constructor.);

str = new char[MaxStr]; // Вызов глобальной new[].

strncpy(str, s, MaxStr); // Копирование строки в объект,

str[MaxStr-1] = 0; // На всякий случай...

}

Hold::~Hold() // Деструктор.

{

trace(Destructor.);

delete[] str; // Очистка объекта.

}

void *Hold::operator new(size_t size)

{

trace(Class new.);

return malloc(size);

}

void Hold:: operator delete(void *p)

{

trace(Class delete.);

free(p);

}

void func() // Функция с локальным объектом.

{

Hold funcObj("This is a local object in fund.");

funcObj.show();

}

int main()

{

trace(*******);

Hold *ptr;

Hold mainObj("This is a local object in main.");

mainObj.show();

trace(*******);

ptr = new Hold("This is a dynamic object.");

ptr->show();

delete ptr;

trace (******);

func();

trace (******);

return 0;

}

Результат работы программы показан на Рис. 7.

Рис. 7