结论:
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