類物件的構造順序是這樣的:
1.分配記憶體,呼叫建構函式時,隱式/顯示的初始化各資料成員(建構函式列表的初始化方式不是按照列表的的順序,而是按照變數宣告的順序同時初始化顯隱資料成員);
2.進入建構函式後在建構函式中執行一般賦值與計算。
class a
};void main()
執行順序為:
初始化x(0) 初始化y(1) 初始化z(x)
執行建構函式體,賦值x=100;
這個例子在網上很多部落格都有,但是發現他們的解釋全都錯了!
class weapon
string getprofile()
};int main(void)
執行後的結果是
可以發現這和我們預期的是不一樣的,不是應該name:cloud嗎??
網上其他的部落格對此做出的解釋「是注意觀察,建構函式裡的 name = "cloud"; 被初始化列表的值覆蓋了」
嗯..這其實是瞎扯淡..
再理一下順序
執行初始化表name(name), type(type), model(model)
執行建構函式體name = "cloud";
問題的所在就是建構函式體中的name
其實是引數,而非weapon類中的成員變數。我們稍作改變
weapon(string& nam, string& type, string& model) :name(nam), type(type), model(model)
發現這時候答案就和想象中的一樣了
成員的初始化列表和建構函式在對成員指定初值方面是不一樣的。成員初始化列表是對成員初始化,而建構函式,是對成員賦值
這樣就限制了,有些情況必須用成員初始化列表。
比如說
class a
};class b
};
這個例子中就必須使用a(m1)
因為a的建構函式被重寫了,無參建構函式不存在,如果不使用初始化表方式對a進行初始化,缺省會呼叫a(),但事實上沒有這個建構函式,因此會報錯。
但如果a有無參建構函式,則可以
class a
a()
};class b
};
但是在這裡,相當於a被初始化了兩次,浪費了時間。
拷貝建構函式的引數為什麼必須使用引用型別
對於包含成員變數的類而言
拷貝建構函式 拷貝初始化
1 格式 1 foo const foo other 複製建構函式 左值賦值 2 foo foo other 移動建構函式 右值賦值 3 explicit foo size type count 禁止隱性轉換 2 引數與返回值 沒理解?2 合成拷貝建構函式 編譯器會將給定物件中非static成員拷貝...
c 建構函式初始化類成員
includeusing namespace std class box box box int h,int w,int l int box volume int main box box int h,int w,int l hight h width w length l int box volu...
C 直接初始化,拷貝初始化,呼叫哪個建構函式?
很多c 新手不明白直接初始化 拷貝初始化,不清楚初始化過程中使用哪個建構函式。在學習過程中,要有基本概念,並且養成正確的認識也是非常重要的。因此整理了本文。常見錯誤認識1 1.使用 和使用 定義物件沒什麼區別。直接初始化 拷貝初始化。2.直接初始化使用建構函式。錯,也可能使用拷貝建構函式。3.拷貝初...