C++理解(1)–c++中的对象的构造顺序与析构顺序
问题:当程序中存在多个对象时,如何确定这些对象的析构顺序?
一.单个函数创建时构造函数的调用顺序
1.调用父类的构造过程
2.调用成员变量的构造函数(调用顺序与声明顺序相同)
3.调用类自身的构造函数
析构函数与对应构造函数的调用顺序相反!多个对象析构时析构顺序与构造顺序想反
**注解:**main函数之前是可以执行代码的。因为main函数之前,执行器主要做:
- 配置堆栈
- 初始化静态与全局变量
- 初始化全局变量赋值
- 运行全局构造器
- 将mian函数的两个变量传参数(argv,argc)
因此将构造函数放在main之前是可以执行函数的。(并且是一个全局变量)
下面是执行代码分析:
#include <stdio.h>
class Member
{
const char* ms;
public:
Member(const char* s)
{
printf("Member(const char* s): %s\n", s);
ms = s;
}
~Member()
{
printf("~Member(): %s\n", ms);
}
};
class Test
{
Member mA;
Member mB;
public:
Test() : mB("mB"), mA("mA")
{
printf("Test()\n");
}
~Test()
{
printf("~Test()\n");
}
};
Member gA("gA");
int main()
{
Test t;
return 0;
}
代码结果:
Member(const char* s): gA
Member(const char* s): mA
Member(const char* s): mB
Test()
~Test()
~Member(): mB
~Member(): mA
~Member(): gA
观察上述代码,可以发现代码存在两个类,没有父类关系。调用的顺序要与声明的顺序相同。
全局变量Member gA(“gA”)
局部变量:Member mA; Member mB,(注意mA和mB这两个变量得顺序不要被 Test() : mB(“mB”), mA(“mA”)这里的定义顺序搞混了,我们的构造顺序是声明的顺序,而不是定义的顺序
调用的顺序为:gA,mA,mB,Test().
而析构函数与构造函数的调用顺序相反,所以析构函数的调用顺序为:~Test(), mB, mA, gA.