CPP 建構函式 成員初始化表 拷貝建構函式

2022-06-09 17:36:10 字數 1790 閱讀 5367

類物件的構造順序是這樣的:

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.拷貝初...