C++全局对象,静态局部对象,自动局部对象构造析构顺序

结论:

1)全局对象构造在main函数执行之前。

2)对于出现在同一个文件内的全局对象来说,它们初始化的顺序与他们声明的顺序是一致的(销毁的顺序则反过来)。而对于不同文件间的全局对象,c++ 标准并没有明确规定它们之间的初始化(销毁)顺序应该怎样,因此实现上完全由编译器自己决定。

3)静态局部对象构造在第一次执行对象定义之时。注意仅第一次会构造,第二次不会。

4)全局对象与静态局部对象析构都在main函数执行之后。静态局部对象析构早于全局对象析构。

5)自动局部对象构造在执行对象定义之时。自动局部对象析构在所处语句块的末尾。

测试代码:

#include<stdio.h>

class A {
    int a;
public:
    A(int i) {a = i; printf("A() %d\n", a);}
    ~A() {printf("~A() %d\n", a);}
};

void myStatic() {
    printf("myStatic() enter\n");
    static A obj4(4);    // 对象4: 静态局部对象
    printf("myStatic() end\n");
}

void myAuto() {
    printf("myAuto() enter\n");
    A obj3(3);    // 对象3: 自动局部对象
    printf("myAuto() end\n");
}

A obj1(1);    // 对象1: 全局对象
A obj2(2);    // 对象2: 全局对象

int main() {
    printf("main() enter\n");
	myAuto();
    myStatic();    // 第1次进入
    myStatic();    // 第2次进入
    printf("main() end\n");
    return 0;
}

结果:
A() 1
A() 2
main() enter
myAuto() enter
A() 3
myAuto() end
~A() 3
myStatic() enter
A() 4
myStatic() end
myStatic() enter
myStatic() end
main() end
~A() 4
~A() 2
~A() 1

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值