天天看點

第10周-任務0-構造和析構函數的執行過程執行個體解析

【題目】閱讀程式,先分析程式的執行結果,在上機時運作程式進行對照,再通過單步執行跟蹤程式的運作,達到了解基類、派生類中構造函數、析構函數執行過程的目的。

程式如下:

運作結果及解釋:

運作結果

對運作結果的說明

the default constructor of part was called 0

the default constructor of whole was called 0

程式中第60行定義對象w1時,執行構造函數的結果。

對于基類part、派生類中的part對象成員執行的都是預設構造函數;

最後執行派生類whole的預設構造函數的函數體中的語句。

the constructor of part was called 1

the constructor of part was called 3

the constructor of part was called 2

the constructor of whole was called 4

程式中第61行定義對象w2時,執行構造函數的結果。

調用構造函數的過程也是先基類、再派生類中的對象成員,最後執行派生類構造函數的函數體。

此處執行的均是帶參數的構造函數。

注意到在建立對象w2(1,2,3,4)時,第48行函數調用的實參為:part(1),two(2),one(3),data(4)。

可能讓人意外的是,給出的數字是1 3 2 4,而不是1 2 3 4。

這告訴我們,w2中對象成員one的構造函數one(3)執行在前,對象成員two的構造函數two(2)執行在後。

對象成員的構造順序依其在對象中定義 的順序(見第20和21行),而不是構造函數中的書寫順序。

為什麼?因為在一個whole對象中,各資料成員是順序存儲的,配置設定空間,one在前,two在後。

c++是人工語言。大多數問題是有依據的,多想想有好處,但初學時常想不到。

是以,一旦有想不通的,将觀察得到的現象有大腦中留有映像,随着學習的深入就明白了。

the destructor of whole was called 4

the destructor of part was called 2

the destructor of part was called 3

the destructor of part was called 1

退出f()函數的調用時,結束局部對象w2的生命周期,執行析構函數。

要調用的析構函數的順序正好與前構造函數的順序相反:先構造的後析構,後構造的先析構。

the destructor of whole was called 0

the destructor of part was called 0

退出f()函數的調用時,結束局部對象w1的生命周期,執行析構函數。

w1比w2先定義,而析構函數的執行卻在後。

這個結果是由系統自動決定的,程式員需要明白其中的遊戲規則。

繼續閱讀