Инструменты пользователя

Инструменты сайта


examination:oop:question36

36. Деструкторы: назначение, основные свойства, способы задания: по умолчанию или явное. Программирование алгоритма деструктора.

Дестру́ктор — специальный метод класса, служащий для деинициализации объекта. Деструктор не имеет параметров. Деструктор представляет собой функцию, которую C++ автоматически запускает, когда он или ваша программа уничтожает объект. Деструктор имеет такое же имя, как и класс объекта; однако вы предваряете имя деструктора символом тильды (~), например ~ClassName. В своей программе вы определяете деструктор точно так же, как и любой другой метод класса.

Пример:

  #include <iostream>
    using namespace std;
 
    class NameOfClass
    {
        private:
             int a;
        public:
             NameOfClass(int m);
             ~NameOfClass();
    };
 
    NameOfClass::~NameOfClass()
    {
        cout << this->a << endl;
    }
 
    NameOfClass::NameOfClass(int m)
    {
        a = m;
    }

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

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

Пример:

class Father
{
public:
  Father() {}
  virtual ~Father() {} 
};
 
class Son : public Father
{
private:
  int* buffer;
public:
  Son() : Father() { buffer = new int[1024]; }
  ~Son() { delete[] buffer; }
};

Когда указатели объектов выходят за пределы контекста, неявный вызов деструктора не происходит. Это значит, что для разрушения такого объекта операция delete должна быть задана явно.

Деструкторы вызываются строго в обратной последовательности относительно последовательности вызова соответствующих им конструкторов

examination/oop/question36.txt · Последние изменения: 2014/01/15 12:22 (внешнее изменение)