全局对象:
由于全局对象可能在文件中的不同地方被调用,因此编译器会优先编译全局对象,也就是说,全局对象先于主函数产生,放在全局区(或称静态区,地址由低到高),待整个程序运行完后析构释放。
静态对象:
静态对象只会在首次调用时构造一次,之后再次调用会跳过构造,与全局对象有相同的生存期,放在全局区,待整个程序运行完后析构释放。如下方代码调用多次只有第一次会构造静态变量:
#include <iostream>// 预处理命令
using namespace std; // 使用标准命名空间std
class A {
public:
A(int a) {
cout << "有参构造函数调用" << endl;
num = a;
}
private:
int num = 0;
};
void f() {
static A temp(1);
return;
}
int main() {
f();
f();
return 0;
}
输出结果为:有参构造函数调用
局部对象:
局部对象的构造顺序与文本定义的顺序一致(类的数据成员也属于这种情况),放在栈区(地址由高到低),所在作用域运行完成后析构释放。
多文件中的全局对象:
C++中的编译顺序是先编译cpp文件,当全局对象分布在多个文件中时,其构造顺序不一定。
比如全局对象a在A.cpp文件中初始化,而全局对象b在B.cpp文件中,且b调用a进行拷贝构造,则不确定b是否可以被成功初始化,因为无法确定A.cpp和B.cpp哪个先被编译器编译。
具体调试方法可以先按照正常顺序编写两个文件,然后调换两个文件中的内容,再编译一次,比较两次结果有什么不同。