【題目】閱讀程式,先分析程式的執行結果,在上機時運作程式進行對照,再通過單步執行跟蹤程式的運作,達到了解基類、派生類中構造函數、析構函數執行過程的目的。
程式如下:
運作結果及解釋:
運作結果
對運作結果的說明
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先定義,而析構函數的執行卻在後。
這個結果是由系統自動決定的,程式員需要明白其中的遊戲規則。