程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++四種不同的對象生存方式,四種對象生存

C++四種不同的對象生存方式,四種對象生存

編輯:C++入門知識

C++四種不同的對象生存方式,四種對象生存


在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第一次被調用)時被調用。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved