初始化是一樣的,只是暫且沒有區別
這樣就不行了
他認為初始化列表是每個成員變量定義的地方。日期類成員可以在函數體內也可以初始化列表內。但是有一類成員只能
比如説有一個const成員,如果這個const成員在函數體內初始化是不行的
const只有一次初始化機會,在他定義的地方,
這樣就不行了,並且定義必須初始化。 成員變量的定義放到初始化列表去了,
還有引用成員必須在初始化列表初始化,引用必須初始化,必須在定義地方初始化,所以這個引用成員也不能在函數體內玩,必須在初始化列表
我期望ref是這個x的別名
class Time
{
public:
Time(int hour)
:_hour(hour)
{
cout << "Time()" << endl;
}
private:
int _hour;
};
class Date
{
public:
Date(int& xx, int year, int month, int day)
:_year(year)
,_month(month)
,_day(day)
,_n(1)
,_ref(xx)
,_t(1)
,_ptr((int*)malloc(12))
{
if (_ptr == nullptr)
{
perror("malloc fail");
}
else
{
memset(_ptr, 0, 12);
}
}
void Print() const
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
聲明
int _year;
int _month;
int _day;
error C2512: “Time”: 沒有合適的默認構造函數可用
error C2530 : “Date::_ref” : 必須初始化引用
error C2789 : “Date::_n” : 必須初始化常量限定類型的對象
const int _n;
int& _ref;
Time _t;
int* _ptr;
};
這有一個time作為成員變量,我不寫,會不會調用他的構造,會的,初始化列表是他定義的地方,每個成員都會區他定義的地方,哪怕不寫也會走初始化列表。 初始化列表就會去調用默認構造,如果沒有默認構造,只能這麼寫
就跟顯示調構造函數一樣,所以自定義類型成員我想顯示構造,不想調用默認構造,也可以這樣寫,
就算有默認構造,也可以這麼寫,我定義時候沒有調默認構造,就是説有默認構造時候我可以寫可以不寫,沒有默認構造時候我必須在這這麼寫。
這三個如果不走初始化列表就會報錯
初始化列表和函數體內能不能混着用,有些場景也必須混着用
假設我在這給了個指針,我可以在初始化列表malloc,不知道成功失敗,又不能在初始化列表看,就在函數體
初始化列表和函數體是可以打配合的
這是對象整體定義,對象裏面成員變量在初始化列表定義_day可以不寫,因為有些變量可以不初始化
_day是個隨機值,不確定的。
C++11也有這種寫法,這也不是定義,是聲明,空間開出來才是定義。後面是缺省值
如果初始化列表沒有寫那就缺省值初始化,寫了就用初始化列表顯示的值
如果我們不寫構造,編譯器會生成一個構造,生成的叫默認構造,因為他無參,不傳參,這時候年月日會初始化,按理內置類型不初始化C++11給了缺省值,自己寫了構造沒寫的地方初始化列表會用他,,默認生成也會用他
缺省值不僅可以給值,還可以給表達式。以後儘可能用初始化列表。因為走不走初始化列表,她都會走初始化列表,比如説寫了初始化列表,那他值定義時候就用初始化列表這個值,如果沒寫就看有沒有缺省值。 有缺省值就用缺省值初始化,如果沒有缺省值對於內置類型那就不確定了,可能隨機值,可能初始化0了,這個看編譯器。如果自定義類型那就調用默認構造,如果沒有默認構造那就報錯了。對於 引用 const必須在初始化列表初始化,
如果上面給了缺省值,下面缺省值的關係,
聲明時候不給值了,——day會不會初始化成1,不會,是不確定的,函數參數缺省值 是我有沒有顯示傳參,顯示傳參之後我就沒法用了,下面那個缺省值,是初始化列表沒寫的話自動用這個值,默認構造也有初始化列表,缺省值就是在初始化列表走的初始化列表和默認構造沒有關係,默認構造是穿不傳參的構造,初始化列表,哪個函數都會走的。沒有關係
_a1還沒初始化就用_a1沒問題,建立對象時候空間已經開好了,能訪問到的
先走a1初始化a2,a1是隨機之值,再初始化a1選D,按聲明順序走,生命順序實際是內存存放順序。
上面那個缺省值沒用,沒顯示傳雖然使用了缺省值,但是沒用缺省值初始化,進入這個函數之後
會走這裏,是初始化列表就用缺省值初始化。
就開好空間了
A aa,這是初始化,有空間但是不能存數據