C 建構函式初始化列表與賦值

2021-07-05 20:06:04 字數 2161 閱讀 4316

c++類中成員變數的初始化有兩種方式:

建構函式初始化列表和建構函式體內賦值。下面看看兩種方式有何不同。

成員變數初始化的順序是按照在那種定義的順序。

1 內部資料型別(char,int……指標等)

class animal

animal(int weight,int height)//

b函式體內初始化

private:

int m_weight;

int m_height;

};

對於這些內部型別來說,基本上是沒有區別的,效率上也不存在多大差異。

當然a和b方式不能共存的。

2 無缺省建構函式的繼承關係中

class animal

private:

int m_weight;

int m_height;

};class dog: public animal

private:

int m_type;

};

這種必須在派生類中建構函式中初始化提供父類的初始化,因為物件構造的順序是:

父類——子類——……

所以必須:

class dog: public animal

private:

int m_type;

};

構造乙個物件是從內向外構造的,也就是先構造基類,再構造派生類。因此必須在派生類建構函式執行前先執行基類建構函式。

你的那個例子因為建構函式都是最簡單的無引數型別,所以無所謂,不需要額外明白的寫出來,c++會預設幫你呼叫無引數的base()。實際上完整的寫法應該是這樣的:

class follow

}只不過你不這麼寫c++也會預設幫你這麼呼叫而已。

如果基類的建構函式是帶引數的,那就必須明白寫出來了:

class base

};class follow

}

3 類中const常量,必須在初始化列表中初始,不能使用賦值的方式初始化

class dog: public animal

private:

int m_type;

const

int legs;

};

4 包含有自定義資料型別(類)物件的成員初始化

class food

food(food &other)//

拷貝建構函式

food & operator =(food &other)//

過載賦值=函式

private:

int m_type;

};(1)建構函式賦值方式 初始化成員物件m_foodclass dog: public animal

private:

food m_food;

};//

使用food fd;

dog dog(fd); //

dog dog(fd);結果:先執行了 物件型別建構函式food(int type = 10)——>

然後在執行 物件型別建構函式food & operator =(food &other)

想象是為什麼?

(2)建構函式初始化列表方式class dog: public animal

private:

food m_food;

};//

使用food fd;

dog dog(fd); //

dog dog(fd);結果:執行food(food &other)拷貝建構函式完成初始化

不同的初始化方式得到不同的結果:明顯建構函式初始化列表的方式得到更高的效率。

C 建構函式初始化列表與賦值

c 類中成員變數的初始化有兩種方式 建構函式初始化列表和建構函式體內賦值。下面看看兩種方式有何不同。成員變數初始化的順序是按照在那種定義的順序。1 內部資料型別 char,int 指標等 class animal animal int weight,int height b函式體內初始化 priva...

C 建構函式初始化列表與賦值

初始化和賦值對內建型別的成員沒有什麼大的區別,像任乙個建構函式都可以。但有的時候必須用帶有初始化列表的建構函式 1 成員型別是沒有預設建構函式的類。若沒有提供顯式初始化時,則編譯器隱式使用成員型別的預設建構函式,若類沒有預設建構函式,則編譯器嘗試使用預設建構函式將會失敗。2 const成員或引用型別...

C 建構函式初始化列表與賦值

c 類中成員變數的初始化有兩種方式 建構函式初始化列表和建構函式體內賦值。下面看看兩種方式有何不同。成員變數初始化的順序是按照在那種定義的順序。1 內部資料型別 char,int 指標等 class animal animal int weight,int height b函式體內初始化 priva...