答案是: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函數!!!