最近看到這樣一道筆試題,偶學習整理了一下,不到之處,希望各位指正。
問題: 下列程式的輸出是什麼?
#include
<
iostream
>
using namespace std;
classa ~
a()
};classb ~
b()
private
:a a;
};class
c: publica ~
c()
private
:b b;
public
:a a;
};int
main()
正確答案是:
下面是我的分析:
把握幾個原則:
1)父類首先被初始化,初始化順序與繼承順序相同。這裡c繼承a,所以要先初始化其父類a。
2)物件初始化時, 類成員變數的空間分配和初始化是在呼叫建構函式之前,無論是public的還是private的。
3)類成員變數的初始化順序是由它們的宣告順序決定的,無論是public還是private的。
4)物件析構時,變數釋放和析構函式的呼叫與初始化相反。
所以上面的列印結果分析如下:
a -- 父類class a 的建構函式列印出來
a -- 初始化class c的成員變數b b,b繼承a,所以再次呼叫a的建構函式列印
b -- class c的成員變數呼叫自己的建構函式列印
a -- 初始化class c的成員變數a a,a的建構函式列印
c -- 最後才是c自己的建構函式列印
析構過程與上述順序相反。
派生類的初始化列表
說明派生類物件時,1 先呼叫各基類的建構函式 這裡分兩種情況 1.1 顯式地在初始化列表中呼叫基類的建構函式,如 b a int 這樣的話,就呼叫a的有參建構函式 1.2 沒有顯式呼叫,編譯器把基類的預設建構函式插入到初始化列表中,即b b a 2 再呼叫物件成員的建構函式 這裡分兩種情況 2.1 ...
C 派生類中如何初始化基類物件
今天收到盛大的面試,問我乙個問題,關於派生類中如何初始化基類物件,我在想派生類對於建構函式不都是先構造基類物件,然後在構造子類物件,但是如果我們在成員初始化列表先初始化派生類的私有成員,在函式內去呼叫基類的建構函式,能編譯通過嗎?或者當我們定義了基類的預設建構函式,而沒有去在派生類的建構函式中顯示的...
C 派生類中如何初始化基類物件
今天收到盛大的面試,問我乙個問題,關於派生類中如何初始化基類物件,我在想派生類對於建構函式不都是先構造基類物件,然後在構造子類物件,但是如果我們在成員初始化列表先初始化派生類的私有成員,在函式內去呼叫基類的建構函式,能編譯通過嗎?或者當我們定義了基類的預設建構函式,而沒有去在派生類的建構函式中顯示的...