轉:Inside the C++ Object Model學習筆記[Chap6]

來源:互聯網
上載者:User
第6章執行期語意學 6.0 引言對如下的類定義以及操作:class Y {       public:              Y();              ~Y();              bool operator==( const Y& ) const;};class X {       public:              X();              ~X();              operator Y() const; // conversion              X getValue();};那麼如下的運算式:if ( yy == xx.getValue() )則在執行時被轉化為:{       X temp1 = xx.getValue();           //引入X型的臨時變數       Y temp2 = temp1.operator Y();      //引入Y類型的臨時變數        int temp3 = yy.operator == (temp2); //引入int型的臨時變數       if ( temp3 ) ……temp2.Y::~Y();       //Y解構函式temp1.X::~X();       //X解構函式} 6.1 對象的構造與析構注意:如果一個區段或函數中有多個離開點,那麼解構函式必須放在每一個離開點之前(如果當時對象還有效話)。 6.1.1全域對象對如下程式片斷:Matrix identity;int main() {       Matrix m1 = identity;       return 0;}C++保證,一定會在main函數中第一次用到identity前,把identity構造出來,而在main函數結束之前把identity銷毀掉。如果這樣的全域對象有建構函式和解構函式的話,將需要靜態初始化與記憶體釋放操作。C++程式中所有的全域對象都被放置在程式的資料區段中,如果明確指定給它一個值,則該對象以該值作為初值,否則對象所配置的記憶體內容為0(C中並不自動化佈建初值)。 6.1.2局部靜態對象函數內的局部靜態對象只能構造一次以及析構一次,而且在執行到該定義點處在構造。在cfront中確保這個動作正確地完成引入一個臨時量來表示是否已構造,而在析構時則通過取出其資料區段中的地址來有條件地調用確保正確。 6.1.3對象數組對於數組定義:Point knot[ 10 ];如果Point沒有定義建構函式也沒有定義解構函式,那麼其工作不會比建立一個內建類型所組成的數組更多,及只需要配置足夠的記憶體以儲存10個連續的Point元素。但若是定義了建構函式和解構函式,則必須輪流地施行於每一個元素之上。在cfront中,使用一個vec_new()函數,產生出以類物件建構而成的數組,vec_new()的聲明一般如下:void* vec_new(void* array, size_t elem_size, int elem_count,                       void (*constructor )( void* ), void (*destructor) ( void*, char ));同樣,在銷毀時採用對應的vec_delete函數,其聲明如下:void* vec_delete( void* array, size_t elem_size, int elem_count,                       void (*destructor)( void*, char )); 6.1.4預設建構函式與數組沒多大意義,因此忽略其內部所做的實現。 6.2 new與delete運算子略。詳細討論見“C++動態記憶體建立與記憶體管理學習筆記”。 6.3 臨時對象在C++中真正的臨時對象是看不見的,它們不出現在你的原始碼中。建立一個沒有命名的非堆(non-heap)對象會產生臨時對象。這種未命名的對象通常在兩種條件下產生:為了使函數成功調用而進行隱式類型轉換和函數返回對象時。在任何時候只要見到常量引用(reference-to-const)參數,就存在建立臨時對象而綁定在參數上的可能性。在任何時候只要見到函數返回對象,就會有一個臨時對象被建立(以後被釋放)。對於臨時對象的生存期問題,有如下的原則:臨時對象的摧毀,應該是在造成臨時對象產生的完整運算式求值過程中的最後一個步驟。但有兩個例外:1. 運算式被用來初始化一個對象時,要求存留到對象的初始化操作完成為止;

2. 當一個臨時對象被一個引用綁定時,對象將在引用的聲明結束或臨時對象的聲明範疇結束之(視哪一種情況先到達而定)時才銷毀。 
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.