在C++中,有四種方法產生一個對象。
第一種方法是在堆棧(stack)之中產生:
void MyFunc()
{
CFoo foo;//在堆棧(stack)中產生foo對象
}
第二種方法是在堆(heap)中產生它:
void MyFunc()
{
CFoo* pFoo=new CFoo();//在堆(heap)中產生對象
}
第三種方法是產生一個全局對象(同時也必然是個靜態對象)
CFoo foo;//在任何函數范圍外做此操作
第四種方法是產生一個局部靜態對象
void CMyFunc()
{
static CFoo foo;//在函數范圍之內的一個金泰對象
}
不論哪一種做法,C++都會產生一個針對CFoo構造函數的調用操作。
前兩種情況,C++在配置內存之後,立刻產生一個隱藏的構造函數調用。
第三種情況,由於對象實現於任何"函數活動范圍"之外,顯然沒有地方來安置這樣一個構造函數調用操作。第三種情況的構造函數調用操作必須靠startup代碼幫忙。startup是早於程序進入點(main或WinMain)執行起來的代碼,由c++編譯器提供,被鏈接到程序中。startup代碼可能做些像函數庫初始化、進程信息設立、I/O stream產生等操作,以及對static對象的初始化操作(也就是調用其構造函數)。當編譯器編譯你的程序,發現一個靜態對象時,它會把這個對象加到一個鏈表中,並且還加上一個指針,指向對象的構造函數及其參數。把控制權交給程序進入點之前,starup代碼會遍歷鏈表,調用所有登記的構造函數和參數,這樣就初始化了靜態對象。
第四種情況(局部靜態對象)只會有一個實例產生,而且在固定的內存上(既不是stack也是heap)。它的構造函數在控制權第一次轉移到其聲明處(也就是在MyFunc第一次被調用)時被調用。