天天看点

c++中,程序运行调用的第一个函数一定是main函数吗?

答案是:no

举个例子说明:

main.cpp有如下代码:

#include <iostream>

C c;

int main()

{

    A *pa = new A;

    B b;

    static D d;

    deleta pa;

    return 1;

}

说明: A、B、C、D 为四个类,请问这4个类的构造调用的顺序是什么? ??对应的析构调用的顺序又是什么???

答案:  构造调用顺序: C A B D

            析构调用顺序: A B D C

由此可见,程序运行后调用的第一个函数不是main函数。实际上,第一个调用的函数是类C的构造函数。

分析:

         对于类A, 是建立在堆上的对象指针pa,手动释放;

         对于类B,是建立在栈上的对象b,main函数结束时释放;

         对于类C,是在静态存储区建立全局对象c,程序结束时释放;

         对于类D,也是在静态存储区建立对象d,但是去局部对象,程序结束时释放;

         问题来了,对于同一个文件中的全局对象,谁先构造???

         答: 同一个文件中的全局对象,先定义的对象先构造。

        问题又来了,对于不同文件中的全局对象,谁先构造???

        答:不同文件中的全局对象的构造顺序没有规定!!!!但是,我们可以采用特殊的方法,使之有顺序。方法是这样的,采用局部静态对象,可以避免不同文件中全局对象构造的顺序问题。对于局部静态对象,标准规定,在函数首次调用的时候构造局部静态对象!通过控制函数调用的顺序就可以控制静态对象的调用顺序!

        注意: 静态存储区都是先构造的后析构

       所以,对于上面的程序,类A 对象,第一个析构, 类B对象是局部栈对象,main函数结束时,第二个析构,类C和类D对象都在静态存储区,类C先构造,所以类C后析构,第三个析构的是类D对象,最后一个析构的是类C对象。

      对于构造,类C全局对象第一个构造,同时类D对象也在静态存储区,但是它是局部对象,所以要调用时才构造,现在进入main函数,按顺序,第二个调用构造的是类A对象,第三个类B对象,最后一个类D对象。

      综上所述:程序运行调用的第一个函数可以不是main函数!!!

继续阅读