栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

全局对象:

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

静态对象:

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847079.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号