(1) 區別「賦值」 和 「初始化」這兩個概念:
我們知道普通變數編譯器都會預設的替你初始化。他們既能初始化,也能被賦值的,而常量(const)按照其意思只能被初始化,不能賦值。否則與變數就無區別了。所以常量成員(const member)只能用成員初始化列表來完成他們的「初始化」,而不能在建構函式內為他們「賦值」。
我們知道類的物件的初始化其實就是呼叫他的建構函式完成,如果沒有寫建構函式,編譯器會為你預設生成乙個。如果你自定義了帶引數的建構函式,那麼編譯器將不生成預設建構函式。這樣這個類的物件的初始化必須有引數。如果這樣的類的物件來做另外某個類的成員,那麼為了初始化這個成員,你必須為這個類的物件的建構函式傳遞乙個引數。同樣,如果你在包含它的這個類的建構函式裡用「=」,其實是為這個物件「賦值」而非「初始化」它。所以乙個類裡的所有建構函式都是有引數的,那麼這樣的類如果做為別的類的成員變數,你必須顯式的初始化它,你也是只能通過成員初始化列表來完成初始化。例如:
(2)在繼承裡面,只有初始化列表可以構造父類的private成員。比如說
class child : public foo
foo裡面的建構函式是這樣寫的:foo (int x) .
而在child裡面寫child(int x)是通過不了編譯的。只有把父類初始化改為foo(int x) : a(x){}而子類構造寫作child (int x) : foo(x){}才可以。
成員初始化列表 初始化同賦值的區別
成員初始化列表 初始化同賦值的區別 1.我們可以認為建構函式的執行過程被分成兩個階段,隱式或顯式初始化階段以及一般的計算階段。計算階段由建構函式體內的所有語句構成,在計算階段中資料成員的設定被認為是賦值而不是初始化。初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的...
c 初始化列表和直接賦值的區別
定義兩個建構函式 sales data const std string s bookno s sales data const std string s,unsigned n,double p bookno s units sold n revenue p n 這兩個定義中,冒號以及冒號和花括號之...
初始化和賦值的區別
區別說明 賦值操作是在兩個已經存在的物件間進行的,而初始化是要建立乙個新的物件,並且其初值 於另乙個已存在的物件。編譯器會區別這兩種情況,賦值 的時候呼叫過載的賦值運算子,初始化的時候呼叫拷貝建構函式。如果類中沒有拷貝建構函式,則編譯器會提供乙個預設的。這個預設的拷貝建構函式只是簡單地復 製類中的每...