1. 程式人生 > >深入c++物件模型之執行期語意學

深入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的宣告結束,或直到臨時物件的聲明範疇結束------視哪一種情況先到達而定。