Деструктор
Деструктор - это специальный метод класса, который автоматически вызывается при уничтожении объекта. Он служит для освобождения ресурсов, которые объект захватил за время своей жизни: памяти, файловых дескрипторов, сетевых соединений и так далее. Деструктор не принимает параметров и не возвращает значения, поэтому перегрузить его или указать аргументы по умолчанию невозможно. В классе может быть только один деструктор.
Имя деструктора совпадает с именем класса, но начинается
с символа тильда '~'. Деструктор вызывается
автоматически в следующих случаях: когда объект выходит
из области видимости, когда удаляется объект, созданный
через new, а также при уничтожении временных объектов.
Синтаксис
class ClassName
{
public:
~ClassName()
{
// освобождение ресурсов
}
};
Пример
Давайте создадим класс, который в конструкторе и деструкторе выводит сообщения. Так мы увидим, в какой момент вызывается деструктор:
#include <iostream>
using namespace std;
class Test
{
public:
Test()
{
cout << "constructor" << endl;
}
~Test()
{
cout << "destructor" << endl;
}
};
int main()
{
Test obj;
cout << "inside main" << endl;
return 0;
}
Результат выполнения кода:
"constructor"
"inside main"
"destructor"
Пример
Деструктор особенно полезен, когда объект владеет динамической памятью. Давайте создадим класс, который выделяет массив в конструкторе и освобождает его в деструкторе:
#include <iostream>
using namespace std;
class Array
{
private:
int* data;
public:
Array(int size)
{
data = new int[size];
cout << "memory allocated" << endl;
}
~Array()
{
delete[] data;
cout << "memory freed" << endl;
}
};
int main()
{
Array arr(5);
return 0;
}
Результат выполнения кода:
"memory allocated"
"memory freed"
Пример
Если объект создан через new, деструктор вызывается
только при явном вызове delete. Давайте проверим это:
#include <iostream>
using namespace std;
class Test
{
public:
~Test()
{
cout << "destructor called" << endl;
}
};
int main()
{
Test* obj = new Test();
cout << "before delete" << endl;
delete obj;
cout << "after delete" << endl;
return 0;
}
Результат выполнения кода:
"before delete"
"destructor called"
"after delete"
Смотрите также
-
конструктор
constructor,
который вызывается при создании объекта -
ключевое слово
decl,
которое объявляет тип данных -
спецификатор
public,
который открывает доступ к членам класса -
спецификатор
private,
который закрывает доступ к членам класса