3 回答

TA貢獻1835條經驗 獲得超7個贊
施工總是從基地開始
class
。如果有多個基礎,class
那么構造從最左邊的基礎開始。(旁注:如果有virtual
繼承,則給予更高的偏好)。然后構造成員字段。它們按聲明的順序初始化
最后,它
class
本身就構建了析構函數的順序正好相反
無論初始化列表如何,呼叫順序都是這樣的:
Base
class A
的構造函數class B
將構造名為a
(類型class A
)的字段派生
class B
的構造函數

TA貢獻2021條經驗 獲得超8個贊
假設沒有虛擬/多重繼承(這使事情變得復雜很多),那么規則很簡單:
分配對象存儲器
執行基類的構造函數,以大多數派生結束
執行成員初始化
該對象成為其類的真實實例
執行構造函數代碼
需要記住的一件重要事情是,直到第4步,對象還不是其類的實例,因為它只有在構造函數的執行開始后才能獲得此標題。這意味著如果在成員的構造函數期間拋出異常,則不會執行對象的析構函數,但只會破壞已構造的部分(例如成員或基類)。這也意味著如果在成員或基類的構造函數中調用對象的任何虛擬成員函數,則調用的實現將是基礎實現,而不是派生實現。另一個要記住的重要事項是,初始化列表中列出的成員將按照它們在類中聲明的順序構建,
還要注意,即使在執行構造函數代碼期間,this
對象已經獲得了它的最終類(例如,關于虛擬分派),除非構造函數完成其執行,否則不會調用類的析構函數。只有當構造函數完成執行時,對象實例才是實例中真正的第一類公民...在此之前只是一個“想成為實例”(盡管有正確的類)。
破壞以完全相反的順序發生:首先執行對象析構函數,然后它丟失其類(即從對象上的這一點被視為基礎對象)然后所有成員以反向聲明順序銷毀,最后是基類銷毀過程被執行到最抽象的父級。對于構造函數,如果在基類或成員析構函數中調用對象的任何虛擬成員函數(直接或間接),則執行的實現將是父實例,因為在類析構函數完成時對象丟失了其類標題。

TA貢獻1793條經驗 獲得超6個贊
基類始終在數據成員之前構建。數據成員按照在類中聲明的順序構造。此順序與初始化列表無關。初始化數據成員時,它將查看參數的初始化列表,如果沒有匹配則調用默認構造函數。始終以相反的順序調用數據成員的析構函數。
- 3 回答
- 0 關注
- 428 瀏覽
添加回答
舉報