由C 建構函式初始值列表想到的

2021-07-07 03:10:52 字數 963 閱讀 3553

大家在編寫c++**的時候,總是會遇到下面這個問題,什麼時候為建構函式提供初始值列表(當然,推薦做法都是以初始值列表代替建構函式體內賦值)。資料成員初始化動作是在建構函式體之前的,相對應的,析構函式的資料成員銷毀動作是在析構函式體之後的。所常見的必須提供初始值列表的情況有,

前面兩個比較好理解,const和引用都是必須在宣告時賦初值的。但是資料成員中有自定義型別時,就要考慮自定義型別有沒有預設建構函式了,例如下面**:

classb};

class

a};

上述**編譯是不會通過的,因為資料成員mem_b沒有提供預設建構函式,所以在進入函式體賦值之前,是要報錯的。注意,如果自定義型別沒有提供拷貝賦值運算子,編譯器會為其提供合成的拷貝賦值運算子執行簡單記憶體拷貝操作。

但是為什麼人們經常會忽視第三種情況呢,這是由於人們有個誤區。

其實自定義型別和內建型別說到底都是型別,都是描述資料在記憶體中的組織方式和對應的操作。這樣說是不嚴謹的,編譯原理中對資料型別的定義是,一組值得集合,以及對這組值進行的操作(運算)的集合。資料在計算機記憶體中無非是二進位制位串的集合,本身沒有任何意義,有意義的是如何對其進行解釋。

任何語言都有自定義型別,如果語言只有內建型別那麼語言的易用性就會有很大折扣。自定義型別是由自定義型別和或者是內建型別的集合構成的,是由現有型別的笛卡爾積表示的。但是自定義型別是有前提的,就是不能存在遞迴情況,如下所示,

class

a;

這種情況下,編譯器對型別a的推導是不會終止的。所以c++規定自定義型別時,需要資料成員是完整型別。

自定義型別與內建型別沒什麼區別,都是一組值的集合和在這些值上的操作。只是這種型別的值域,以及其上的操作需要使用者自己來控制,所以有許多情況需要使用者注意。相對應的,類模版是構造自定義型別的模板,讓使用者在編寫**時能夠動態定義使用者型別。

類建構函式初始值列表

類的成員可以包括函式和成員變數,如果成員變數沒有顯示的初始化時,則應該最好對他們進行顯示的初始化,而不能靠他們的預設初始化,因為有些變數沒有預設初始值的。現在類成員初始化工作都是靠類的建構函式來完成,類中提供預設建構函式來提供初始化類成員功能,初始化類成員一般有兩種方式,即類成員定義時賦初始值和使用...

C 中類的建構函式初始值列表

c 中類的建構函式初始值列表可以對類的成員進行初始化。class myclass 其中,類myclass的建構函式中包含了初始值列表,對成員變數i進行初始化。除了通過建構函式初始值列表來初始化成員變數外,還可以通過建構函式的函式體來初始化成員變數。class myclass 此時,成員變數i的初始值...

必須在建構函式基 成員初始值設定項列表中初始化

c primer 上面的乙個例子 constref.cpp 定義控制台應用程式的入口點。include stdafx.h class constref constref constref int ii constref constref int ii i ii ci i ri ii int tmai...