C++不同类型对象的构造、析构顺序

全局对象:

        由于全局对象可能在文件中的不同地方被调用,因此编译器会优先编译全局对象,也就是说,全局对象先于主函数产生,放在全局区(或称静态区,地址由低到高),待整个程序运行完后析构释放。

静态对象:

        静态对象只会在首次调用时构造一次,之后再次调用会跳过构造,与全局对象有相同的生存期,放在全局区,待整个程序运行完后析构释放。如下方代码调用多次只有第一次会构造静态变量:

#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哪个先被编译器编译。

        具体调试方法可以先按照正常顺序编写两个文件,然后调换两个文件中的内容,再编译一次,比较两次结果有什么不同。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值