c++ 的new 運運算元和c 的malloc 函式都是為了配置記憶體,但前者比之後者的優點
是,new 不但配置物件所需的記憶體空間時,同時會引發構造式的執行。
所謂構造式(constructor),就是物件誕生後第乙個執行(並且是自動執行)的函式,它
的函式名稱必定要與類別名稱相同。
相對於構造式,自然就有個析構式(destructor),也就是在物件行將毀滅但未毀滅之前
一刻,最後執行(並且是自動執行)的函式,它的函式名稱必定要與類別名稱相同,再
在最前面加乙個~ 符號。
#include
using
namespace std;
class cdemo
cdemo(char * ch)
~cdemo()
};void func()
cdemo globalobject("globalobject"); // global static
int main()
以上**的執行結果是:
constructor called for globalobject
constructor called for localobjectinmain
constructor called for heapobjectinmain
in main, before calling func
constructor called for localobjectinfunc
constructor called for staticobject
constructor called for heapobjectinfunc
inside func
desturctor called for localobjectinfunc
in main, after calling func
請按任意鍵繼續. . .
所以可以得到以下幾個結論:
對於區域物件,當物件誕生時,其構造式被執行;當程式流程將離開該物件的
存活範圍(以至於物件將毀滅),其析構式被執行。
對於靜態(static)物件,當物件誕生時其構造式被執行;當程式將結束時(此
物件因而將遭致毀滅)其析構式才被執行,但比全域物件的析構式早一步執
行。對於以new 方式產生出來的區域物件,當物件誕生時其構造式被執行。析構
式則在物件被delete 時執行(上例程式未示範)。
四種不同的物件生存方式(in stack、in heap、global、local static)
在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 第一次被呼叫)時被呼叫。
c 物件的生命週期
c 的new 運運算元和c 的malloc 函式都是為了配置記憶體,但前者比之後者的優點 是,new 不但配置物件所需的記憶體空間時,同時會引發構造式的執行。所謂構造式 constructor 就是物件誕生後第乙個執行 並且是自動執行 的函式,它 的函式名稱必定要與類別名稱相同。相對於構造式,自然就...
物件的生命週期
全域性物件的引用 雖然在c 不允許,但是cil的確允許分配全域性物件 靜態物件 靜態欄位的引用 應用程式的 庫的區域性物件的引用 傳遞進乙個方法的物件引數的引用 等待被終結的物件的引用 任何引用物件的cpu暫存器 要尋找不可達的物件,如果clr逐個檢查託管堆的沒乙個物件,很明顯,效率很低。每個物件都...
C 臨時物件的生命週期
有關臨時物件的生命週期有三種情況 1 一般情況 臨時性物件的被摧毀,應該是對完整表示式 full expression 求值過程中的最後乙個步驟。該完整表示式造成臨時物件的產生。例 include using namespace std class a a a operator const a rh...