Поведение деструктора С++
Я попробовал следующую программу на Visual Studio 2010.
#include <iostream>
using namespace std;
class A {
public:
int p;
/*A(){
cout << "Constructor A" << endl;
}*/
~A(){
cout << "Destructor in A" << endl;
}
};
class D: public A
{
public:
/*D(){
cout << "Constructor D" << endl;
}*/
~D(){
cout << "Destructor in D" << endl;
}
};
int main()
{
D d = D();
cout << "Exiting main" << endl;
}
Выход, который я получил, -
Destructor in D
Destructor in A
Exiting main
Destructor in D
Destructor in A
Я не могу понять, почему деструктор класса D и A вызывается
перед выполнением инструкции "Выход из основного"?
Я попробовал другое - я раскодировал конструктор класса D в приведенном выше коде, тогда вывод был как я
ожидается -
Constructor D
Exiting main
Destructor in D
Destructor in A
Что мне здесь не хватает?
Ответы
Ответ 1
Линия
D d = D();
сначала создает временный, неназванный объект, который затем копируется в d
. То, что вы видите, это временный объект, который уничтожается, когда оператор завершается. Именованный объект d
уничтожается, когда он выходит из области видимости, после завершения main()
.
Если вы добавите конструктор копирования в d
, вы увидите, что он вызывается.
При комментировании конструктора я думаю, что вы видите ожидаемое поведение, потому что компилятор может сделать некоторые оптимизации.