C 含有子物件的類 has a關係

2021-09-19 03:38:00 字數 1309 閱讀 6102

可能會想到這樣的初始化方式

class a 

};class b

};int main()

輸出:

a::a()

a::a()

b::b()

a::a()

a::a()

為了便於觀察,修改a的建構函式

a(int a = 0) : a(a)
輸出:

a::a() a = 0

a::a() a = 0

b::b()

a::a() a = 1

a::a() a = 2

由上面的輸出可見,子物件的初始化在b的建構函式執行前就結束了,也就是說,子物件在b物件執行建構函式的函式體體之前就呼叫了預設的建構函式。

其實上面的寫法不能叫初始化子物件,應該說是給子物件進行賦值操作,就像如果有非靜態const成員,我們必須使用成員初始化列表,而不能在建構函式體中進行賦值操作;也就是說,應該使用成員初始化列表顯式的指示編譯器呼叫哪個構造初始化子物件(預設情況下,預設呼叫無參構造)

修改後的建構函式:

b(int a1, int a2) : obj1(a1), obj2(a2)
注意子物件的成員初始化列表與派生類的不同,派生類使用基類的類名指示呼叫哪個建構函式,而子物件通過物件名指示呼叫哪乙個構造。

派生類物件初始的是自己的基類部分

含有子物件的類是初始化它的物件成員

輸出:

a::a() a = 1

a::a() a = 2

b::b()

可見乙個類的子物件成員的初始化(子物件呼叫建構函式)在該類建構函式體執行之前。

和在類中宣告的順序一致,與成員初始化列表無關

如果將成員初始化列表中的順序修改,不會影響輸出的結果。

這樣更加說明了,成員初始化列表可以定向的告知系統呼叫哪乙個建構函式,但不會影響呼叫建構函式的呼叫。

還拿上面的例子,對於b來說,obj1和obj2是他的物件成員,也就是說,這裡已經屬於類a的類外了,類b不能直接訪問obj1和obj2中的私有成員;同樣,這也不同於繼承,類b沒有繼承類a的介面,類b只能通過類a的介面來間接訪問obj1和obj2的私有成員。

class a 

void f()

};class b

void f()

};int main()

類和物件的關係

類是具有相同資料結構 屬性 和相同操作功能 行為 物件的集合。物件就是符合某種類所產生的乙個例項。物件與類的關係是 物件的共性抽象為類,類的例項化就是物件。類是乙個抽象的概念,而物件是具體的,比如說車是乙個類的話,張三的那輛賓士車就是車這個類的乙個例項,動物是乙個類的話,李四的家養的那只貓就是動物類...

類和物件的關係

類是具有相同資料結構 屬性 和相同操作功能 行為 物件的集合。物件就是符合某種類所產生的乙個例項。物件與類的關係是 物件的共性抽象為類,類的例項化就是物件。類是乙個抽象的概念,而物件是具體的,比如說車是乙個類的話,張三的那輛賓士車就是車這個類的乙個例項,動物是乙個類的話,李四的家養的那只貓就是動物類...

類和物件的關係

類是物件的屬性和行為的總和,類是物件的抽象,物件是類的例項化。類我們叫做class,物件我們叫做object,instance 例項 乙個完整的類包括 成員變數 同一型別的物件的所普遍具有的屬性,所成員變數也叫做屬性 field set get方法 分別用來獲取和設定物件的屬性 成員方法 同一型別的...