class a
輸出:a() //這一行和下一行是為了構造c類物件的基類b,而在構造基類b的時候需要先初始化b的成員變數a,因而呼叫了a的建構函式
b()
a() //這一行和下一行是c類物件在初始化成員變數b時,需要構造b,因此需要先初始化b的成員變數a,因而再次呼叫了a的建構函式
b()
a() //這一行是c類物件初始化成員變數a是,需要構造a
c() //構造完畢c類物件的基類b和自身成員變數a,b之後,呼叫自己的建構函式
~c() //析構次序和構造次序相反
~a()
~b()
~a()
~b()
~a()
大家可以驗證做一些測試,比如把b改為
class b
{ public:
b(){ cout<<"b()"《這樣輸出結果:
b()
b()
a()
c()
~c()
~a()
~b()
~b()
看到了吧,這樣c在構造基類物件b和初始化成員變數b的時候就不用再構造a,因此就去掉了a()。
總結:初始化乙個類物件的時候,首先構造這個類的基類,接著初始化這個類的成員變數,最後呼叫建構函式。自然,析構的順序和構造次序相反。
C 建構函式初始化變數的順序
在 c 中類的建構函式初始值列表 中提到,c 中類的建構函式初始值列表可以對類的成員進行初始化。但是需要注意的是,建構函式的初始化列表只是說明各變數的初始值,並沒有指定變數的初始化順序。其中,myclass類建構函式的初始化列表只是說明了變數i的初始值是1,變數j的初始值是i的值。但是並不一定是先初...
C 類建構函式初始化列表和初始化順序
建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 class cexample 建構函式內部賦值 cexample 上面的例子中兩個建構函式的結果是一樣的。上面的建構函式 使用初始化列表的建構函式 顯式的初始化類的成員 而沒使用初始化...
建構函式初始化列表初始化成員變數的順序
include include include using namespace std class point point point point p intgetx intgety intmain 執行結果如下 可以看到m x m y按照我們預想的結果進行了初始化,輸出結果符合預期。接下來我們將私...