zoukankan      html  css  js  c++  java
  • 全局对象的构造函数会在main函数之前执行?

    #include <iostream>
    using namespace std;
    
    
    class CTest
    {
    public:
    	CTest()
    	{
    		cout << "构造函数..." << endl;
    	}
    	~CTest()
    	{
    		cout << "析构函数..." << endl;
    	}
    };
    
    int main()
    {
    	CTest t;
    	return 0;
    }

    可见:全局对象的构造函数会在main函数之前执行。

    在大多数的实现方式里,核心会运行专门的启动代码,启动代码会在启动main()之前完成所有的初始化工作,这其中当然包括了全局对象的初始化。这个所谓的启动代码就是Runtime函数库的Startup代码。


    在程序执行时,系统会先调用Startup,完成函数库初始化、进程信息设立、I/O stream产生,以及对static对象的初始化等动作。然后Startup调用main()函数,把控制权交给main()函数。main()函数执行完毕,控制权交回给Startup,进行反初始化动作。

    可以看看CRT的代码,里面的CRT初始化过程包含所有全局变量的构造,这些全局变量被编译器放到一个链表中了,CRT初始化时读取链表依次执行回调函数(就是构造函数),然后才执行MAIN入口点函数。

    参考: http://blog.csdn.net/huang_xw/article/details/8542105

    http://www.programlife.net/msvc-crt-startup.html

    https://msdn.microsoft.com/en-us/library/bb918180.aspx

    #include <iostream>
    using namespace std;
    
    
    class CTest
    {
    public:
    	CTest()
    	{
    		cout << "构造函数..." << endl;
    	}
    	~CTest()
    	{
    		cout << "析构函数..." << endl;
    	}
    };
    
    /**
    *  CTest test;
    *  全局对象的析构函数在return执行以后被调用
    */
    
    int main()
    {
    	/**
    	*  CTest test;
    	*  局部对象的析构函数在return执行以前被调用 
    	*/
    
    	/**
    	*  CTest *test = new CTest;
    	*  delete test;
    	*  new生成的对象的析构函数在delete执行以后调用
    	*/
    
    	/**
    	*  static CTest test;
    	*  局部静态对象的析构函数在return执行以后被调用
    	*/
    
    	{
    		/**
    		*  CTest test; 
    		*  test离开此作用域就会调用析构函数
    		*/
    	}
    
    	return 0;
    }
    


    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    SDN第二次作业
    SDN第一次上机作业
    SDN第一次作业
    期末作业验收
    SDN第五次上机作业
    SDN第四次上机作业
    SDN第三次作业
    SDN第三次上机作业
    SDN第二次上机作业
    SDN第二次作业
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/6616361.html
Copyright © 2011-2022 走看看