全部变量、静态全局变量、类静态变量、atexit回调函数的调用顺序

来源:互联网 发布:电信宽带无法连接网络 编辑:程序博客网 时间:2024/06/05 04:02

巩固下c++基础,代码如下:

#include <iostream>#include <vector>#include <map>#include <string>std::vector<void*> structure;std::map<void*, std::string> info;class test1{public:test1(){structure.push_back(this);}~test1(){std::cout<<this<<"---~test1\n";}};class test2{public:test2(){structure.push_back(this);}~test2(){std::cout<<this<<"---~test2\n";}static test1 test1_;};class test3{public:test3(){structure.push_back(this);}~test3(){std::cout<<this<<"---~test3\n";}};class test4{public:test4(){structure.push_back(this);}~test4(){std::cout<<this<<"---~test4\n";}static test3 test3_;};void OnExit(){std::cout<<"--------------------------------------\n";std::cout<<"Call OnExit\n";}static test3 static_test3_;static test1 static_test1_;test2 test2_;test1 test1_;test3 test4::test3_;test1 test2::test1_;int main(int argc, _TCHAR* argv[]){std::cout<<"--------------------------------------\n";std::cout<<"Regist OnExit\n";atexit(OnExit);info[&test2_] = "全局变量test2_";info[&test1_] = "全局变量test1_";info[&static_test1_] = "静态全局变量test1_";info[&static_test3_] = "静态全局变量test3_";info[&test2::test1_] = "静态类变量test2::test1_";info[&test4::test3_] = "静态类变量test4::test3_";std::cout<<"------------------构造----------------\n";for(auto iter = structure.begin(), end = structure.end(); iter != end; ++iter){std::cout<<*iter<<"---"<<info[*iter]<<"\n";}return 0;}


执行结果:


总结:

1.全局变量,静态全局变量,类静态变量的构造顺序依赖于其定义顺序。

2.全局变量,静态全局变量,类静态变量的析构顺序和构造顺序相反。

3.atexit回调函数调用先与全局变量,静态全局变量,类静态变量析构函数调用。

原创粉丝点击