- •Часть 1. Основы создания программ в Си Лекция.1.Язык Си
- •Технология разработки программ
- •Базовые элементы языка Си
- •Представление данных в Си
- •Встроенные типы данных
- •Переменные
- •Операции и выражения
- •Функции
- •Лекция.2.Язык Си Обзор элементов языка Си Типизированные константы
- •Область действия переменных
- •Управляющие конструкции с
- •Массивы и указатели
- •Типы, определяемые пользователем
- •Лекция.3.Препроцессор и отладка программ
- •Макроопределения
- •Условная компиляция
- •1. Предотвращение включения файлов
- •Отладка программ
- •Элементы отладки
- •Лекция.1.Объектно-ориентированное программирование
- •Что такое объектно-ориентированное программирование
- •Пример определений классов
- •Конструктор и деструктор
- •Элементы класса
- •Элементы-функции
- •Элементы данных
- •Класс как область действия
- •Указатель this
- •Лекция.3.Элементы класса Статические элементы класса
- •Статические элементы-функции
- •Специальные элементы-функции класса
- •Конструктор
- •Список инициализации элементов
- •Конструктор копии
- •Операция присваивания
- •Деструктор
- •Операции класса new и delete
- •Функции преобразования
- •Ключевое слово explicit
- •Операции приведения
- •Доступ к базовым классам
- •Простое наследование
- •Конструкторы, деструкторы и наследование
- •Сложное наследование
- •Неоднозначности при сложном наследовании
- •Виртуальные базовые классы
- •Виртуальные функции
- •Чисто виртуальные функции и абстрактные классы
- •Реализация виртуального механизма
- •Лекция.5.Семинар 1-2: Обработка исключений
- •Объекты-исключения
- •Повторное возбуждение исключения
- •Перехват всех исключений
Деструктор
Деструктор является противоположностью конструктора. Он вызывается при уничтожении объектов и должен производить необходимую очистку объекта перед освобождением занимаемой им памяти.
Именем деструктора должно быть имя класса, которому предшествует тильда (~). Свойства деструкторов таковы:
Деструктор не имеет параметров.
Он не может возвращать значений.
Деструктор не наследуется.
Деструктор не может объявляться как static, const или volatile.
Деструктор может быть объявлен виртуальным.
Операции класса 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