前言
被一道題目困擾了好久,搞死我了。一直學Java的我,根本不知道C++竟然有這種神仙玩意兒,實屬給我整懵了。
它是個啥
-
Initializers List
-
顧名思義,就是初始化 ,但和構造函數的賦值不同的是
- 初始化列表在對象被構造前執行
- 構造函數的賦值是在構造時執行
使用
- "a(value)" 即 “a = value”
搞我的題目
- 要求輸出
5,5
5,5
#include <iostream>
using namespace std;
class Base
{
public:
int k;
Base(int n):k(n) {}//類型轉換構造函數
};
class Big
{
public:
int v;
Base b;
/*
題目原來是:
Big【 】
Big【 】
【填空題】
*/
Big
Big
};
int main()
{
Big a1(5);
Big a2 = a1;
cout << a1.v << "," << a1.b.k << endl;
cout << a2.v << "," << a2.b.k << endl;
return 0;
}
-
咱來分析一下,觀察一下Big的成員變量
- int v
- Base b
-
巧了,Base是個類,那我們再看看Base類
class Base
{
public:
int k;
Base(int n):k(n) {}//類型轉換構造函數
};
-
很容易看到,它沒有無參構造函數,它不像Java那樣有默認無參構造啊!!!而,Big類裏面,直接Base b,沒有初始化,動不動就給你丟個“no match”噁心你。
-
那咋辦??對象創建了,得構造啊!!!!成員變量不都得準備好嘛!!!!
-
所以,只要我
E得夠快初始化在構造之前,不就行了嗎!!!!!! -
所以用到我們的初始化列表:
Big():b(0){this->v=0;}
Big(int n):b(n){this->v = n;}
好言相勸
- 所以呀,以後凡是要構造賦值的,直接整這個就完了!!!a(v)
出答案了哈哈哈哈哈哈,寫錯了,尷尬的一批
我的原答案:
// 題目沒說要0,這邊要寫的應該是【拷貝構造】!!!
Big():b(0){this->v=0;}
// 要用初始化列表就都用,不要用一半,{}空着就空着
Big(int n):b(n){this->v = n;}
老師給的答案:
Big(const Big& a):v(a.v),b(a.b.k){}
Big(int n):v(n),b(n){}