理解C 存在繼承和組合的物件構造函式呼叫順序

2021-07-04 23:48:35 字數 1150 閱讀 9073

前言:

hello,全世界早上好啊,哈哈,9月你好,2023年9月的第一天,也是自己本科生涯的最後一年了,接下來就是校招走上自己的職場,昨天是大四的第一節課,上的是軟體工程,挺喜歡的一門課,要好好體會一下其中的思想,哈哈,扯遠了,往下的日子裡,更要好好努力,今天以一道面試題為說起,理解或者說感受類中關於建構函式的呼叫順序問題:

let』s show the code:

#include 

using

namespace

std;

class a

~a()

};class b

~b()

private:

a a;

};class c : public a

~c()

private:

b b;

a a;

};int main()

以上程式執行結果圖一:

圖二:沒重新整理輸出緩衝區時最後析構函式中待輸出的內容沒有輸出,編譯環境g++

小結:

可以看到:

1)帶有繼承以及組合的類的建構函式順序是: 父類的建構函式->組合成員物件的建構函式 ->子類自己的建構函式;

2)類成原變數的空間分配及初始化是在呼叫自己建構函式之前進行的,他們的宣告初始化順序由宣告順序決定,這個點在建構函式的初始化列表中的面試考點經常考到,注意,不是由其出現在初始化列表中的順序決定,而是由其在類中宣告的順序決定其初始化的順序;

3)物件在析構的時候,析構函式的呼叫順序與建構函式的執行順序相反,這個很容易理解,因為常規建立物件比如classa a;是在棧裡建立物件的,程式結束或離開了物件的作用域,自然要清空那個原來的棧,棧的彈出都是從棧頂裡面乙個個出棧的,但要注意通過new來建立的物件是在堆中建立的,所以對於new出來的物件是在delete的時候才會呼叫其析構函式,否則不會呼叫析構函式,即使其離開了作用域或者程式結束都不會呼叫其析構函式;

參考資料:

謝謝

繼承和物件組合

類繼承和物件組合是復用的兩種最常用的技術。一 繼承 繼承是is a 的關係,比如說student繼承person,則說明student is a person。繼承的優點是子類可以重寫父類的方法來方便地實現對父類的擴充套件。繼承的缺點有以下幾點 父類的內部細節對子類是可見的。子類從父類繼承的方法在編...

C 物件導向(二)繼承和組合

復用 的方式 繼承和組合 繼承 復用 的一種方式,可以復用 或概念。組合 復用 不能復用概念。在c 中,object類是一切類的直接父類或間接父類。子類擁有所有父類的非私有成員。建構函式不能繼承 建立子類時,自動呼叫父類的建構函式,並且父類中的先執行 概念復用 dog dog new dog ani...

原型和建構函式的組合繼承

採用一下的call的這種方式,會使得引用資料型別不受多個new 的相互影響。function person name function student age 原型繼承 student.prototype newperson 1 由於上行的繼承,使得student.prototype.constru...