Рубрики

Частный деструктор

Также читайте: Может ли конструктор быть закрытым в C ++?
Прогнозировать выход следующих программ.

// Программа CPP для иллюстрации
// Частный деструктор
#include <iostream>

using namespace std;

  

class Test {

private:

    ~Test() {}

};

int main()

{
}

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

Теперь, что вы говорите о программе ниже.

// Программа CPP для иллюстрации
// Частный деструктор
#include <iostream>

using namespace std;

  

class Test {

private:

    ~Test() {}

};

int main()

{

    Test t;

}

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

// Программа CPP для иллюстрации
// Частный деструктор
#include <iostream>

using namespace std;

  

class Test {

private:

    ~Test() {}

};

int main()

{

    Test* t;

}

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

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

// Программа CPP для иллюстрации
// Частный деструктор

  
#include <iostream>

using namespace std;

  

class Test {

private:

    ~Test() {}

};

int main()

{

    Test* t = new Test;

}

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

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

// Программа CPP для иллюстрации
// Частный деструктор

  
#include <bits/stdc++.h>

using namespace std;

  

class Test {

public:

    Test() // Конструктор

    {

        cout << "Constructor called\n";

    }

  

private:

    ~Test() // Частный деструктор

    {

        cout << "Destructor called\n";

    }

};

  

int main()

{

    Test* t = (Test*)malloc(sizeof(Test));

    return 0;

}

Выход:

  

Тем не менее, приведенная ниже программа не удается при компиляции. Когда мы вызываем delete, вызывается деструктор.

// Программа CPP для иллюстрации
// Частный деструктор
#include <iostream>

using namespace std;

  

class Test {

private:

    ~Test() {}

};

int main()

{

    Test* t = new Test;

    delete t;

}

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

// Программа CPP для иллюстрации
// Частный деструктор
#include <iostream>

  
// Класс с приватным деструктором

class Test {

private:

    ~Test() {}

    friend void destructTest(Test*);

};

  
// Только эта функция может разрушать объекты Test

void destructTest(Test* ptr)

{

    delete ptr;

}

  

int main()

{

    // создаем объект

    Test* ptr = new Test;

  

    // разрушаем объект

    destructTest(ptr);

  

    return 0;

}

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

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

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

Рекомендуемые посты:

Частный деструктор

0.00 (0%) 0 votes