C 建構函式與初始化列表

2021-09-07 22:27:56 字數 815 閱讀 3343

c++引入建構函式的目的在於對變數的初始化做出強制,因為人們發現,程式的錯誤,很大程度上來說,都是由變數沒有初始化造成的。

因此,一種很好的程式設計習慣就是,在定義變數的時候直接初始化。而在c++中,在變數定義時,系統會自動呼叫變數的建構函式對變數進行初始化。只要將相應的初始化**放在建構函式中,就能夠保證該類在例項化物件的時候能夠給物件賦以理想的初值。

而事實遠遠沒有這麼簡單。

實際上,程式在進入建構函式的大括號體時,就已經完成了變數的定義(也就是分配記憶體空間)。這就難免會造成這樣的一種情況:在物件被構造時,程式進入建構函式大括號體之前,首先呼叫物件的default建構函式,然後進入建構函式體內,重新對變數進行賦值。這無疑降低了程式的效率。

還有更糟糕的情況。

如果乙個物件必須經由乙個非default建構函式進行定義才能夠在將來被正常地賦值,而系統預設地呼叫了它的default建構函式,就會出現很大的錯誤。

因此,c++的設計者引入了建構函式初始化列表的概念。也就是說,在建構函式的初始化列表之中進行的是對變數的定義與初始化(分配記憶體空間),而不是簡單的賦值。這樣就能夠解決上述的效率以及對建構函式的選擇的問題。

這一點在mfc中體現得尤為明顯。繼承的類一般會在初始化列表中呼叫能夠其父類的建構函式。

應為在初始化列表中發生的是成員變數的定義,也就是分配空間,因此初始化列表中構造的順序與實際編譯器定義變數的順序可能是不一致的,也就是說,編譯器不會按照設計者在初始化列表中初始化變數的順序來為變數分配記憶體空間。初始化列表中變數的初始化順序時其在類體內定義的順序。

同樣得,因為const型成員變數只能在被定義的同時被初始化而不能夠再次被賦值,它也只能被放在建構函式的初始化列表中。

C 建構函式 ,初始化列表

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

C 建構函式初始化列表

從概念上講,可以認為建構函式分兩個階段進行 1.初始化階段 2.普通的計算階段。計算階段由建構函式函式體中的所有語句組成 不管成員是否在建構函式初始化列表中顯示初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段的開始之前。建議 使用建構函式初始化列表 注 必須對任何const或引用...

C 建構函式初始化列表

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 example example ival 0 dval 0.0 ival 和dval是類的兩個資料成員 上面的例子和下面不用初始化列表的建構函式看似沒什麼區別 example exam...