由于全局对象可能在文件中的不同地方被调用,因此编译器会优先编译全局对象,也就是说,全局对象先于主函数产生,放在全局区(或称静态区,地址由低到高),待整个程序运行完后析构释放。
静态对象:静态对象只会在首次调用时构造一次,之后再次调用会跳过构造,与全局对象有相同的生存期,放在全局区,待整个程序运行完后析构释放。如下方代码调用多次只有第一次会构造静态变量:
#include// 预处理命令 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哪个先被编译器编译。
具体调试方法可以先按照正常顺序编写两个文件,然后调换两个文件中的内容,再编译一次,比较两次结果有什么不同。



