为什么 "child" object 析构函数在 "parent" object 析构函数之后执行?
Why does a "child" object destructor execute after the "parent" object destructor?
我有一个 class(“parent”),它的成员是另一个 class(“child”):
class Engine // THE "PARENT" CLASS
{
public:
// CONSTRUCTOR ------------------------------------
Engine() : mConfig {} // "CHILD" CLASS INITIALIZED HERE
{
// ...
return;
}
// DESTRUCTOR -------------------------------------
~Engine()
{
std::cout << "Engine destructor executing...\n";
// ...
return;
}
private:
GameConfig mConfig; // THE "CHILD" CLASS AS MEMBER OF "PARENT"
};
“child”class定义为:
class GameConfig // THE "CHILD" CLASS DEFINITION
{
public:
// ...
// DESTRUCTOR -------------------------------------
~GameConfig()
{
std::cout << "Writing config data...\n";
// ...
return;
}
};
我在 main 中实例化“parent”,后者又(通过初始化列表)实例化“child”class:
int main()
{
Engine gameEngine {};
// ...
std::cout << "Goodbye!\n";
return(0);
}
基于 this question 在 SO 上的提问,以及逻辑上,我认为“child”object 的析构函数会在“parent" object 的析构函数。但是,当我执行这段代码时,输出是:
Goodbye!
Engine destructor executing...
Writing config data...
所以问题是:为什么“child”object析构函数在“parent”object析构函数之后执行?
(我将避免使用“父”和“子”,因为这些术语通常指的是 class 通过继承而不是组合相关的事物。)
销毁 C++ 对象涉及执行其析构函数的主体和编译器自动生成的其他销毁工作,例如销毁成员对象和调用基础 class 析构函数。
在调用析构函数的主体之后必须进行额外的工作。如果它发生在之前,包含对象的析构函数将无法对其成员执行任何操作,这在大多数情况下会使析构函数无用。
我有一个 class(“parent”),它的成员是另一个 class(“child”):
class Engine // THE "PARENT" CLASS
{
public:
// CONSTRUCTOR ------------------------------------
Engine() : mConfig {} // "CHILD" CLASS INITIALIZED HERE
{
// ...
return;
}
// DESTRUCTOR -------------------------------------
~Engine()
{
std::cout << "Engine destructor executing...\n";
// ...
return;
}
private:
GameConfig mConfig; // THE "CHILD" CLASS AS MEMBER OF "PARENT"
};
“child”class定义为:
class GameConfig // THE "CHILD" CLASS DEFINITION
{
public:
// ...
// DESTRUCTOR -------------------------------------
~GameConfig()
{
std::cout << "Writing config data...\n";
// ...
return;
}
};
我在 main 中实例化“parent”,后者又(通过初始化列表)实例化“child”class:
int main()
{
Engine gameEngine {};
// ...
std::cout << "Goodbye!\n";
return(0);
}
基于 this question 在 SO 上的提问,以及逻辑上,我认为“child”object 的析构函数会在“parent" object 的析构函数。但是,当我执行这段代码时,输出是:
Goodbye!
Engine destructor executing...
Writing config data...
所以问题是:为什么“child”object析构函数在“parent”object析构函数之后执行?
(我将避免使用“父”和“子”,因为这些术语通常指的是 class 通过继承而不是组合相关的事物。)
销毁 C++ 对象涉及执行其析构函数的主体和编译器自动生成的其他销毁工作,例如销毁成员对象和调用基础 class 析构函数。
在调用析构函数的主体之后必须进行额外的工作。如果它发生在之前,包含对象的析构函数将无法对其成员执行任何操作,这在大多数情况下会使析构函数无用。