Рубрики

Можно ли явно вызывать конструктор и деструктор?

All the days of the afflicted are evil but he 
that is of a merry heart hath a continual feast.
Proverbs 15:15 (Bible) 


Конструктор — это специальная функция-член, которая автоматически вызывается компилятором при создании объекта, а деструктор также является специальной функцией-членом, которая также неявно вызывается компилятором, когда объект выходит из области видимости. Они также вызываются, когда динамически размещенный объект выделяется и уничтожается, новый оператор выделяет память и конструктор вызовов, удаляет деструктор операторов и освобождает память, выделенную новым.

Можно ли явно вызывать конструктор и деструктор?
Да, программист может явно вызывать специальные функции-члены. Следующая программа вызывает конструктор и деструктор в явном виде.

#include <iostream>

using namespace std;

  

class Test

{

public:

    Test()  { cout << "Constructor is executed\n"; }

    ~Test() { cout << "Destructor is executed\n";  }

};

  

int main()

{

    Test();  // Явный вызов конструктора

    Test t; // локальный объект

    t.~Test(); // Явный вызов деструктора

    return 0;

}

Выход:

Constructor is executed
Destructor is executed
Constructor is executed
Destructor is executed
Destructor is executed 

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

Я: Почему C ++ позволяет явно вызывать конструктор? Тебе не кажется, что этого не должно быть?
Доктор Бьярне: Нет. Временные объекты типов классов полезны.

Раздел 12.4 / 14 стандарта C ++ говорит, что
Как только деструктор вызывается для объекта, объект больше не существует; поведение не определено, если деструктор вызывается для объекта, время жизни которого закончилось [Пример: если деструктор для автоматического объекта вызывается явно, и блок затем остается таким образом, который обычно вызывает неявное уничтожение объекта, поведение не определено. — конец примера.

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

Локальные объекты автоматически уничтожаются компилятором, когда они выходят из области видимости, и это является гарантией языка C ++. Как правило, специальные функции-члены не должны вызываться явно.
Конструктор и деструктор также могут быть вызваны из функции-члена класса. Смотрите следующую программу:

#include <iostream>

using namespace std;

  

class Test

{

public:

    Test()  { cout << "Constructor is executed\n"; }

    ~Test() { cout << "Destructor is executed\n";  }

    void show()  {  Test();  this->Test::~Test();  }

};

  

int main()

{

    Test t;

    t.show();

    return 0;

}

Выход:

Constructor is executed
Constructor is executed
Destructor is executed
Destructor is executed
Destructor is executed

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

В качестве упражнения прогнозируем вывод следующей программы:

#include <iostream>

using namespace std;

  

class Test

{

public:

    Test()  { cout << "Constructor is executed\n"; }

    ~Test() { cout << "Destructor is executed\n";  }

    friend void fun(Test t);

};

void fun(Test t)

{

    Test();

    t.~Test();

}

int main()

{

    Test();

    Test t;

    fun(t);

    return 0;

}

Источники:
http://www.parashift.com/c++-faq/dont-call-dtor-on-local.html
http://www.parashift.com/c++-faq/placement-new.html
http://msdn.microsoft.com/en-us/library/35xa3368.aspx

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

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

Можно ли явно вызывать конструктор и деструктор?

0.00 (0%) 0 votes