Пример деструктора C ++ | Деструкторы в учебнике C ++

Деструктор C ++ — это функция-член, которая разрушает или удаляет объект. Функция деструктора вызывается автоматически, когда объект выходит за пределы области видимости: (1) функция завершается. (2) программа заканчивается. (3) заканчивается блок, содержащий локальные переменные. (4) Вызывается оператор удаления. Мы уже видели Конструктор на C ++ в этом блоге.

Деструктор C ++

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

Деструктор вызывается, когда:

  1. Завершение программы: Когда объект объявляется с глобальной областью видимости или со статическим классом, деструктор выполняется автоматически, когда программа заканчивается на очистить память, занятую этим объектом.
  2. Поток управления из блока: в случае, когда объекты определены с локальной областью видимости в конкретном блоке деструктор вызывается, когда элемент управления выполнением выходит из этого конкретного блока, будь то функция, цикл или условие.
  3. Функция удаления: когда удаление функция выполняется/вызывается для определенного члена данных, тогда деструктор для этого объекта вызывается немедленно, даже если t память не освобождена. См. Следующий синтаксис. delete data_member;
  4. Явный вызов деструктора: Иногда необходимо явно вызвать деструктор, чтобы очистить ресурсы на абсолютные адреса, которые могут быть невозможны с оператором удаления, поскольку эта память никогда не выделялась из свободного пространства.

См. следующий синтаксис.

 имя_объекта. имя_класса :: ~ имя_класса (); 

# Программа для объявления деструкторов

См. следующую программу.

 #include  using namespace std; class apple {public: int roll;  apple () {//Конструктор roll = 5;  cout  

См. следующий вывод.

# Правила объявления деструктора

  1. Он определяется с тем же именем, что и имя класса, которому предшествует оператор тильды (~).
  2. Он не содержит никаких аргументов или параметров.
  3. Он не возвращает никакого значения (даже void).
  4. В конкретном классе может быть только один деструктор.

# Требуется явное объявление деструктора

Хотя сам компилятор предоставляет деструктор по умолчанию, неплохо объявить деструктор самостоятельно, когда:

  1. Использование функций динамического распределения памяти в программе.
  2. Вы используете указатели/ссылки для доступа к элементам данных.

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

# Порядок уничтожения

# Виртуальные базовые классы

В в случае виртуальных базовых классов, т. е. классов, функции и переменные-члены которых могут быть переопределены и переопределены подклассами внешнего класса, деструктор выполняется в обратном порядке в графе наследования.

Следовательно, он начинается с нижнего класса last-child и идет вверх от крайнего левого угла вправо, следуя всем возможным путям. Итак, чтобы создать список классов, имеющих все уникальные элементы и содержащих их все.

См. Следующий синтаксис.

 class a; class b; class c  : virtual public a, virtual public b; class d: virtual public a, virtual public b; class e: public c, public d, virtual public b; 

Для указанного выше объявления список идет например,

 Невиртуальный класс eНевиртуальный класс dНевиртуальный класс cVirtual class bVirtual class a 

# Невиртуальные базовые классы

С невиртуальными классами деструктор запускается в соответствии с порядком, в котором используются имена классов при объявлении дочернего класса. Это происходит в обратном порядке, то есть начиная справа налево в инструкции, объявляющей дочерний класс.

См. Следующий пример.

 class child:  public parent1, public parent2 

В этом случае сначала выполняется деструктор для класса parent2, а затем деструктор для parent1.

# Как деструкторы отличаются от обычных функций-членов.

  1. Деструкторы имеют то же имя, что и класс, которому предшествует тильда (~).
  2. Деструктор не принимает никаких аргументов и ничего не возвращает.

# Может ли у нас быть более одного деструктора в классе?

Нет, в классе может быть только один деструктор с именем класса, которому предшествует ~ (тильда), без параметров и без возвращаемого типа.

# Когда нам нужно писать определяемый пользователем деструктор?

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

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

# Может ли деструктор быть виртуальным?

Да, это всегда хорошая идея сделать деструкторы виртуальными в базовом классе, когда у нас есть виртуальная функция.

#Virtual Destructor

Удаление производного класса объект, использующий указатель на базовый класс, который имеет не виртуальный деструктор, приводит к неопределенному поведению. Если мы хотим исправить эту ситуацию, базовый класс должен быть определен с помощью виртуального деструктора.

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

Итак, здесь мы заканчиваем статью о примере C ++ Destructor.

Оцените статью
nanomode.ru
Добавить комментарий