c 建構函式中初始化列表的作用和機制

2021-06-22 21:04:24 字數 1088 閱讀 4542

c++中建構函式有初始化列表,目的是用於變數的初始化。

class a

//基類初始化成員變數

protected:

int a;

};class b :public a

//派生類不能初始化基類成員變數

};

這樣是正確的:

#includeusingnamespace std;

class a

};class b :public a

//基類的成員函式

void printinfo()

};

也可以這樣:

#includeusingnamespace std;

class a

protected:

int a;

};class b :publica

};

其中為什麼要使用初始化列表是因為:

1.常量成員,因為常量只能初始化不能賦值,所以必須放在初始化列表裡面;

2.引用型別,引用必須在定義的時候初始化,並且不能重新賦值,所以也要寫在初始化列表裡面;

3.沒有預設建構函式的類型別,因為使用初始化列表可以不必呼叫預設建構函式來初始化,而是直接呼叫拷貝建構函式初始化。

另外乙個重點問題是:成員是按照他們在類中出現的順序進行初始化的,而不是按照他們在初始化列表出現的順序初始化的。

#include #include using namespace std;

class base

//這裡改變順序

base():m_j(0),m_i(m_j){}

int get_i()

int get_j() };

class a

;int main(int argc, char* argv)

{ base obj(98);

cout《這裡就有乙個有趣的問題,雖然m_j出現在m_i前面,但m_i在m_j前面定義,所以先初始化m_i,此時m_j還是隨機數,所以m_i就被初始化為乙個隨機數。

建議:按照成員的定義順序進行初始化!

c 中建構函式和初始化列表

我不是筆記的創造者,我只是筆記的搬運工 1 建構函式可以過載,也可以帶有預設引數 匹配string的無參建構函式 string s 匹配string的有參 const char 建構函式 string s hello 2 預設建構函式 無參建構函式 1 如果類中沒有定義任何建構函式,編譯器會為該類提...

建構函式初始化列表和初始化函式

其實並沒有所謂的初始化函式的概念,本文中的初始化函式只是說明在函式體內進行賦值。而初始化列表才是真正意義上的物件初始化。使用初始化列表效率會高一點。c 規定,物件的成員變數的初始化動作發生在進入建構函式本體之前。在建構函式體內只是賦值,並不是初始化。請看下面這個栗子 class base publi...

C 建構函式 ,初始化列表

c 中的類的建構函式 1.如果類中沒有定義建構函式,編譯器將生成乙個預設建構函式,這個預設建構函式會呼叫類中所有成員的預設建構函式,但不會對如int,double的基本資料型別做初始化 2.類中可以定義多個建構函式,但每個建構函式應該有不同的引數實現 3.預設建構函式必須定義的情況,當需要定義乙個物...