c 四種不同的物件生存方式

2021-04-13 11:05:34 字數 1008 閱讀 6229

在c++ 中,有四種方法可以產生乙個物件。第一種方法是在堆疊(stack)之中產生它:

void myfunc()

第二種方法是在堆積(heap)之中產生它:

void myfunc()

第三種方法是產生乙個全域物件(同時也必然是個靜態物件):

cfoo foo; // 在任何函式範圍之外做此動作

第四種方法是產生乙個區域靜態物件:

void myfunc()

不論任何一種作法,c++ 都會產生乙個針對cfoo 構造式的呼叫動作。前兩種情況,c++

在配置記憶體-- 來自堆疊(stack)或堆積(heap)-- 之後立刻產生乙個隱藏的(你的原

**中看不出來的)構造式呼叫。第三種情況,由於物件實現於任何「函式活動範圍

(function scope)」之外,顯然沒有地方來安置這樣乙個構造式呼叫動作。

是的,第三種情況(靜態全域物件)的構造式呼叫動作必須靠startup 碼幫忙。startup 碼

是什麼?是更早於程式進入點(main 或winmain)執行起來的碼,由c++ 編譯器提供,

被聯結到你的程式中。startup 碼可能做些像函式庫初始化、程序資訊設立、i/o stream 產

生等等動作,以及對static 物件的初始化動作(也就是呼叫其構造式)。

當編譯器編譯你的程式,發現乙個靜態物件,它會把這個物件加到乙個序列之中。更精

確地說則是,編譯器不只是加上此靜態物件,它還加上乙個指標,指向物件之構造式及

其引數(如果有的話)。把控制權交給程式進入點(main 或winmain)之前,startup 碼

會快速在該序列上移動,呼叫所有登記有案的構造式並使用登記有案的引數,於是就初

始化了你的靜態物件。

第四種情況(區域靜態物件)相當類似c 語言中的靜態區域變數,只會有乙個實體

(instance)產生,而且在固定的記憶體上(既不是stack 也不是heap)。它的構造式在

控制權第一次移轉到其宣告處(也就是在myfunc 第一次被呼叫)時被呼叫。 

四種不同物件的生存方式(棧 堆 全域性 區域性靜態)

分析 題目的考查點,靜態物件的建立及執行。類中的靜態物件只會執行一次,這是輸出上面結果的原因。擴充套件分析 此種靜態物件的題目之前在360面試的時候被問到過,後來在 深入淺出mfc 基礎部分講解c 重要性質之 c 程式的生與死 兼談建構函式與析構函式部分的示例很能說明問題。include using...

C 物件賦值的四種方式

1.引用作為引數的方式傳遞.getobject object obj obj.value value1 特點 在外部構造乙個物件.把該物件以引用的方式傳遞到函式中.從而實現對該物件的改變,該引數實質是乙個 out 型別的引數,而非 in 型別的引數.這裡的引用可以稱為別名.點評 這種方式需要特別的注...

C 物件賦值的四種方式

1.引用作為引數的方式傳遞.getobject object obj obj.value value1 特點 在外部構造乙個物件.把該物件以引用的方式傳遞到函式中.從而實現對該物件的改變,該引數實質是乙個 out 型別的引數,而非 in 型別的引數.這裡的引用可以稱為別名.點評 這種方式需要特別的注...