《c++ primer》中提到在以下三種情況下需要使用建構函式初始化列表:
1. 需要初始化的類的成員變數是物件的情況;
2. 需要初始化的類的成員變數由const修飾的或初始化的類的引用成員變數;
3. 子類初始化父類的成員;
情況1:類的成員變數是物件,並且這個物件只有含引數的建構函式,沒有無引數的建構函式;
如果我們有乙個類的成員變數,它本身是乙個類的物件,而且這個成員變數需要帶引數的建構函式進行初始化,這時要對這個類的成員變數進行初始化,就必須呼叫這個類的成員變數的帶引數的建構函式,如果沒有初始化列表,那麼將無法完成這一步,出現報錯。
例如:
#include "iostream"
using namespace std;
class test
; private:
int x;
int y;
int z;
};class mytest
;private:
test test; //宣告
};int main(int argc, _tchar* argv)
因為test有了顯示的帶引數的建構函式,那麼它是無法依靠編譯器生成無參建構函式的,所以沒有三個int型資料,就無法建立test的物件。test類物件是mytest的成員,想要初始化這個物件test,那就只能用成員初始化列表,沒有其它辦法將引數傳遞給test類建構函式。
情況2:需要初始化的類的成員變數由const修飾的或初始化的類的引用成員變數
例如:
class test
//初始化};或
class test
//初始化
}
情況3:子類初始化父類的成員變數,需要在(並且也只能在)引數初始化列表中顯示呼叫父類的建構函式
class test
; test (int x);
void show()
private:
int int_x;
};class mytest:public test;};
int main()
執行順序:
在物件構建過程中,如果有建構函式初始化列表,首先執行初始化列表中的內容,然後執行建構函式。並且,初始化列表中資料的構造順序並不是按照在初始化列表中的先後順序進行的,而是根據初始化列表中資料所在當前類中的定義順序決定的。
例如:
class a
private:
int a;
};class b
private:
int b;
};class c
private:
int c;
a v_a;
b v_b;
};
上面的**,v_a先於v_b定義,因此在建構函式初始化列表中先構造v_a,再構造v_b。 C 建構函式 ,初始化列表
c 中的類的建構函式 1.如果類中沒有定義建構函式,編譯器將生成乙個預設建構函式,這個預設建構函式會呼叫類中所有成員的預設建構函式,但不會對如int,double的基本資料型別做初始化 2.類中可以定義多個建構函式,但每個建構函式應該有不同的引數實現 3.預設建構函式必須定義的情況,當需要定義乙個物...
C 建構函式初始化列表
從概念上講,可以認為建構函式分兩個階段進行 1.初始化階段 2.普通的計算階段。計算階段由建構函式函式體中的所有語句組成 不管成員是否在建構函式初始化列表中顯示初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段的開始之前。建議 使用建構函式初始化列表 注 必須對任何const或引用...
C 建構函式初始化列表
建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 example example ival 0 dval 0.0 ival 和dval是類的兩個資料成員 上面的例子和下面不用初始化列表的建構函式看似沒什麼區別 example exam...