1.有三種情況下是一定要用初始化列表的,單類的資料成員裡面有const成員,或者有資料成員是引用,或
者有沒有預設建構函式的類成員。const和引用成員可以被初始化,但不可以被賦值。而如果乙個類成員沒
有用初始化列表初始化的時候,編譯器在進入建構函式的第一條語句前會先呼叫類成員的預設建構函式。
而如果該類資料成員沒有預設建構函式的時候,就會出項錯誤。這三種情況下是一定要用初始化列表的。
2.在建構函式初始化列表裡面沒有顯式提及的類資料成員按如下規則初時化:如果是內建型別則根據該對
象的位置而定,如果物件是全域性,那麼內建型別被初始化為零,如果不是全域性,那麼內建型別未知。如果
是類型別則呼叫該類的預設建構函式。所以如果那個類沒有預設建構函式,而又不在初始化列表中顯式提
及,就會出錯!
在前面的例程中,我們對成員資料的初始化,都是在函式體中進行的,但有些情況下這種初始化的方法是
行不通的,例如:
#include
using namespace std;
class date
void display()};
int main()
在類data中有乙個成員yr是乙個const int型別,它是不能在函式體中被重新賦值的。這種情況下我們只有
使用另一種特殊的初始化方式——初始化列表。初始化列表位於函式引數表之後,卻在函式體 {} 之前。
這說明該表裡的初始化工作發生在函式體內的任何**被執行之前。
建構函式初始化列表的使用規則:
如果類存在繼承關係,派生類必須在其初始化表裡呼叫基類的建構函式。
class a ;
class b : public a;
b::b(int x, int y): a(x)
類的const常量只能在初始化表裡被初始化,因為它不能在函式體內用賦值的方式來初始化。類的資料成員的初始化可以採用初始化表或函式體內賦值兩種方式,這兩種方式的效率不完全相同。
非內部資料型別的成員物件應當採用第一種方式初始化,以獲取更高的效率。
class a;
class b;
示例(a)中,類b的建構函式在其初始化表裡呼叫了類a的拷貝建構函式,從而將成員物件m_a初始化。
示例(b)中,類b的建構函式在函式體內用賦值的方式將成員物件m_a初始化。我們看到的只是一條賦值語句,但實際上b的建構函式幹了兩件事:先暗地裡建立m_a物件(呼叫了a的無引數建構函式),再呼叫類a的賦值函式,將引數a賦給m_a。
b::b(const a &a): m_a(a)
b::b(const a &a)
對於內部資料型別的資料成員而言,兩種初始化方式的效率幾乎沒有區別,但後者的程式版式似乎更清晰
些。若類f的宣告如下:
class f
示例(c)中f的建構函式採用了第一種初始化方式,示例(d)中f的建構函式採用了第二種初始化方式。
f::f(int x, int y): m_x(x), m_y(y)
f::f(int x, int y) (引自《高質量c++程式設計指南》)
C 建構函式 ,初始化列表
c 中的類的建構函式 1.如果類中沒有定義建構函式,編譯器將生成乙個預設建構函式,這個預設建構函式會呼叫類中所有成員的預設建構函式,但不會對如int,double的基本資料型別做初始化 2.類中可以定義多個建構函式,但每個建構函式應該有不同的引數實現 3.預設建構函式必須定義的情況,當需要定義乙個物...
C 建構函式初始化列表
從概念上講,可以認為建構函式分兩個階段進行 1.初始化階段 2.普通的計算階段。計算階段由建構函式函式體中的所有語句組成 不管成員是否在建構函式初始化列表中顯示初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段的開始之前。建議 使用建構函式初始化列表 注 必須對任何const或引用...
C 建構函式初始化列表
建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 example example ival 0 dval 0.0 ival 和dval是類的兩個資料成員 上面的例子和下面不用初始化列表的建構函式看似沒什麼區別 example exam...