生活随笔
收集整理的這篇文章主要介紹了
C++类中成员变量的初始化有两种方式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C++類中成員變量的初始化有兩種方式:
???????? 構(gòu)造函數(shù)初始化列表和構(gòu)造函數(shù)體內(nèi)賦值。下面看看兩種方式有何不同。
???????? 成員變量初始化的順序是按照在那種定義的順序。
1、內(nèi)部數(shù)據(jù)類型(char,int……指針等)
[cpp] view plaincopy
class?Animal??{??public:??????Animal(int?weight,int?height):???????????????m_weight(weight),????????m_height(height)??????{??????}??????Animal(int?weight,int?height)?????????????{??????????m_weight?=?weight;??????????m_height?=?height;??????}??private:??????int?m_weight;??????int?m_height;??};??對于這些內(nèi)部類型來說,基本上是沒有區(qū)別的,效率上也不存在多大差異。
當(dāng)然A和B方式不能共存的。
?
2、無默認構(gòu)造函數(shù)的繼承關(guān)系中
[cpp] view plaincopy
class?Animal??{??public:??????Animal(int?weight,int?height):????????????????m_weight(weight),????????m_height(height)??????{??}??private:??????int?m_weight;??????int?m_height;??};????class?Dog:?public?Animal??{??public:??????Dog(int?weight,int?height,int?type)?????????{??????}??private:??????int?m_type;??};??上面的子類和父類編譯會出錯:
因為子類Dog初始化之前要進行父類Animal的初始化,但是根據(jù)Dog的構(gòu)造函數(shù),沒有給父類傳遞參數(shù),使用了父類Animal的無參數(shù)構(gòu)造函數(shù)。而父類Animal提供了有參數(shù)的構(gòu)造函數(shù),這樣編譯器就不會給父類Animal提供一個默認的無參數(shù)的構(gòu)造函數(shù)了,所以編譯時報錯,說找不到合適的默認構(gòu)造函數(shù)可用。要么提供一個無參數(shù)的構(gòu)造函數(shù),要么在子類的Dog的初始化列表中給父類Animal傳遞初始化參數(shù),如下:
[cpp] view plaincopy
class?Dog:?public?Animal??{??public:??????Dog(int?weight,int?height,int?type):??????????Animal(weight,height)???????????????{??????????;??????}??private:??????int?m_type;??};???
3、類中const常量,必須在初始化列表中初始,不能使用賦值的方式初始化
[cpp] view plaincopy
class?Dog:?public?Animal??{??public:??????Dog(int?weight,int?height,int?type):??????????Animal(weight,height),???????????LEGS(4)??????????????????????{????????????????}??private:??????int?m_type;??????const?int?LEGS;??};??4、包含有自定義數(shù)據(jù)類型(類)對象的成員初始化????????
[cpp] view plaincopy
class?Food??{??public:??????Food(int?type?=?10)??????{??????????m_type?=?10;??????}??????Food(Food?&other)???????????????????????{??????????m_type?=?other.m_type;??????}??????Food?&?operator?=(Food?&other)????????????{??????????m_type?=?other.m_type;??????????return?*this;??????}??private:??????int?m_type;??};????(1)構(gòu)造函數(shù)賦值方式?初始化成員對象m_food??class?Dog:?public?Animal??{??public:??????Dog(Food?&food)??????????????{??????????m_food?=?food;?????????????????????}??private:??????Food?m_food;??};????Food?fd;??Dog?dog(fd);?????Dog?dog(fd);結(jié)果:??先執(zhí)行了???對象類型構(gòu)造函數(shù)Food(int?type?=?10)——>???然后在執(zhí)行?對象類型構(gòu)造函數(shù)Food?&?operator?=(Food?&other)??想象是為什么?????(2)構(gòu)造函數(shù)初始化列表方式??class?Dog:?public?Animal??{??public:??????Dog(Food?&food)????????:m_food(food)????????????????????????{????????????????}??private:??????Food?m_food;??};????Food?fd;??Dog?dog(fd);?????Dog?dog(fd);結(jié)果:執(zhí)行Food(Food?&other)拷貝構(gòu)造函數(shù)完成初始化??不同的初始化方式得到不同的結(jié)果:
明顯構(gòu)造函數(shù)初始化列表的方式得到更高的效率。
原文轉(zhuǎn)載自點擊打開鏈接
總結(jié)
以上是生活随笔為你收集整理的C++类中成员变量的初始化有两种方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。