Приватный деструктор в C++

Опубликовано: 15 Сентября, 2022

Деструкторы с модификатором доступа как private известны как Private Destructors. Всякий раз, когда мы хотим предотвратить уничтожение объекта, мы можем сделать деструктор приватным.

Какая польза от частного деструктора?

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

Предсказать вывод следующих программ:

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

Теперь, что вы скажете о приведенной ниже программе?

Выход

prog.cpp: In function ‘int main()’:
prog.cpp:8:5: error: ‘Test::~Test()’ is private
    ~Test() {}
    ^
prog.cpp:10:19: error: within this context
int main() { Test t; }

Приведенная выше программа не компилируется. Компилятор замечает, что локальная переменная 't' не может быть уничтожена, поскольку деструктор является закрытым.

А как насчет программы «Ниже»?

Вышеуказанная программа работает нормально. Объект не конструируется, программа просто создает указатель типа «Test *», так что ничего не уничтожается.

Далее, как насчет программы ниже?

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

В случае, когда деструктор объявлен закрытым, экземпляр класса также может быть создан с помощью функции malloc(). То же самое реализовано в приведенной ниже программе.

Вышеупомянутая программа также работает нормально. Однако приведенная ниже программа не компилируется. Когда мы вызываем удаление, вызывается деструктор.

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

Обязательно к прочтению: может ли конструктор быть закрытым в C++?

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

C++ C