建構函式具有名字、形參表和函式體,與其他函式不同的是,建構函式也可以包含乙個建構函式初始化列表
student::student(string a,int b):
name(a), num(b) {}
其中以冒號開始,以左花括號結束的部分為建構函式初始化列表
這個建構函式將name成員初始化為形參a的值,將num成員初始化為形參b的值
然而省略初始化列表並在建構函式的函式體內對資料成員賦值是合法的
student::student(string a,int b)
這兩段**的具有同樣的效果,都是將形參賦給類的資料成員
但這兩段**實質上是不同的
第二段**實際上進行了兩步操作,先進行**初始化(若資料成員都為內建資料型別,則不進行此步)然後再在函式體中對其賦值覆蓋初始化的值
原因是不管成員是否在建構函式初始化列表中顯式初始化,類型別的資料成員總是在初始化階段初始化
其成員初始化方式取決於資料成員的型別:資料成員為類型別的執行預設建構函式進行初始化,而資料成員為內建型別的初始值依賴於物件的作用域:在區域性作用域中這些成員不被初始化,而在全域性變數中它們被初始化為0
也就是說若你在主函式或自定義函式中定義了乙個物件object
int main{}
若其建構函式為第二個版本,則先執行string類的預設建構函式將資料成員name初始化為空串,不對int型的num成員進行初始化,然後再將「xiaohong」賦給name,將1賦給num
若在全域性作用域中定義物件object
student object("xiaohong",1);
int main()
{}則int型的num也會被初始化為0,再被賦值
總的來說,若資料成員都為內建型別,則這兩個版本的建構函式無區別,若有類型別則第二個版本則無端端地多了一步操作:先初始化再賦值。但也無傷大雅
但是,有一些情況卻是一定要使用建構函式初始化列表的
1.資料成員型別是沒有提供預設建構函式的類型別
2.資料成員是const或引用型別。畢竟const型別和引用型別都是只能初始化而不能賦值的
所以,請最好使用建構函式初始化列表形式的建構函式
建構函式初始化列表
建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 example example ival 0 dval 0.0 ival 和dval 是類的兩個資料成員 上面的例子和下面不用初始化列表的建構函式看似沒什麼區別 example exa...
建構函式初始化列表
c 程式語言中有很多比較重要的概念值得我們去深入 比如今天為大家介紹的有關c 建構函式的相關概念。這一方面的知識在實際程式設計中就是乙個比較重要的應用技術。希望能個大家可以從中學到一些知識。c 建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化...
建構函式初始化列表
class object private int v1,v2 看看願意是 先初始化v2為5,然後初始化v1為 3 倍的 v2 但是結果卻是奇葩的,這個是因為建構函式的初始化列表遵循的原則是先初始化父類 父類也是這個原則,那麼就相當於遞迴 然後初始化本類的成員,最後執行建構函式的函式體 而初始化本類的...