深入c++物件模型之執行期語意學
1.物件的構造與解構
一般而言,constructor 和 destructor的安插都會如你所預期:
//c++偽碼
{
Point point;
//point.Point::Point();一般而言會被安插在這裡
...
//point.Point::~Point();一般而言會被安插在這裡
}
注意:一般而言我們會將物件放置在使用它的程式附近,這樣做可以節省不必要的物件產生操作和摧毀操作。
1>全域性物件
c++保證全域性物件,一定會在main()函式中第一次用到前,把其構造出來,在main()函式結束前把其摧毀掉。
下圖表示的是cfront的munch構造全域性物件的過程(摘自《深入探索c++物件模型》):
2>區域性靜態物件
只有在建構函式被呼叫時才初始化靜態區域性物件。
3>物件陣列
如果沒有constructor也沒有destructor,那我們只需足夠的記憶體儲存n個連續的物件元素。
4>default constructor和陣列
cfront採用的方法是產生一個內部的stub constructor ,沒有引數。在其函式內呼叫由程式設計師提供的constructor,並將default 引數明確指定過去。
2.new和delete操作
1>new
int *pi = new int[5];
由兩步構成:
(1)通過適當的new運算子函式實體,配置所需的記憶體:
//呼叫函式庫中的new運算子
int *pi = _new( sizeof(int));
(2)給配置得來的物件設立初值:
*pi = 5;
更進一步的說,初始化操作要在記憶體配置成功之後再執行。
2>delete
只有在中括號出現時,編譯器才尋找陣列的維度,否則它便假設只有單獨一個object要被刪除。如果程式設計師沒有提供必要的中括號,那麼就只有第一個元素被解構,其他的元素仍然存在,雖然相關的記憶體已經被要求歸還。
注意:程式設計師要避免以一個base class指標指向一個derived class objects所組成的陣列。(因為base class object 的一般比derived小,在解構的時候會被錯誤的執行,因而不能解構全部記憶體)。
3.臨時物件
1>在某些情況下,由processor產生臨時性物件是有必要的,亦或是比較方便的。這樣的臨時物件由編譯器來定義。
2>臨時性物件被摧毀,應該是對完整表示式求值過程中的最後一個步驟。該完整表示式造成臨時物件的產生
3>凡含有表示式執行結果的臨時性物件,應該存留到object的初始化操作完成為止。
4>如果一個臨時性物件被綁定於一個reference。物件將殘留,知道被初始化之reference的宣告結束,或直到臨時物件的聲明範疇結束------視哪一種情況先到達而定。