因为对象一般都是定义在栈区的
而栈帧和栈里面的对象都要符合后进先出的性质
也就是后定义的先销毁
class A
{
public:
//默认构造函数
A(int x=1)
{
cout << "A(int x =" << x <<")" << endl;
_x = x;
}
//析构函数
~A()
{
cout << "~A(" << _x << ")" << endl;
}
private:
int _x;
};
int main()
{
A a1(1);
A a2(2);
return 0;
}
![![[Pasted image 20220731105026.png]]](https://1000bd.com/contentImg/2024/05/24/d320e6d9eb044368.png)
构造
析构
因为全局对象在静态区,在所有函数之前执行,所以最先构造
而局部的static对象,存储在静态区,但是第一次执行语句的时候初始化,所以其初始化符合从上到下的顺序
而析构,是因为局部对象定义在栈区,栈区最先销毁
而全局的对象和static修饰的对象在静态区,当整个程序结束的时候才会销毁。 所以其销毁在局部对象之后
A a0(0);
int main()
{
static A a1(1);
A a2(2);
A a3(3);
static A a4(4);
return 0;
}
![![[Pasted image 20220731104953.png]]](https://1000bd.com/contentImg/2024/05/24/de5454785a5a0cd6.png)
对于其他区域的变量的顺序问题
定义多个变量的时候,也需要一个顺序
所以干脆就和栈的顺序保持一致了
static A a0(0);
void f()
{
static A a1(1);
A a2(2);
A a3(3);
static A a4(4);
}
int main()
{
f();
f();
return 0;
}
如果对于上面这种,在函数中定义
应该注意:
所以最后的结果是:
构造顺序: 0 1 2 3 4 2 3 2 3
析构顺序:3 2 3 2 4 1 0
![![[Pasted image 20220731111159.png]]](https://1000bd.com/contentImg/2024/05/24/5cad906896a41988.png)
注意:因为调用了两次f()函数,所以第一次调用之后,2和3先析构了一次