天天看點

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函數!!!

繼續閱讀