類與對象 - 荊荊是個好姑娘的個人空間 -_#算法

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_02

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_03

類與對象 - 荊荊是個好姑娘的個人空間 -_函數體_04

類與對象 - 荊荊是個好姑娘的個人空間 -_初始化列表_05

初始化是一樣的,只是暫且沒有區別

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_06

類與對象 - 荊荊是個好姑娘的個人空間 -_函數體_07

這樣就不行了

類與對象 - 荊荊是個好姑娘的個人空間 -_#c++_08

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_09

他認為初始化列表是每個成員變量定義的地方。日期類成員可以在函數體內也可以初始化列表內。但是有一類成員只能

類與對象 - 荊荊是個好姑娘的個人空間 -_初始化列表_10

比如説有一個const成員,如果這個const成員在函數體內初始化是不行的

類與對象 - 荊荊是個好姑娘的個人空間 -_#c++_11

const只有一次初始化機會,在他定義的地方,

類與對象 - 荊荊是個好姑娘的個人空間 -_函數體_12

這樣就不行了,並且定義必須初始化。        成員變量的定義放到初始化列表去了,

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_13

還有引用成員必須在初始化列表初始化,引用必須初始化,必須在定義地方初始化,所以這個引用成員也不能在函數體內玩,必須在初始化列表

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_14

我期望ref是這個x的別名

類與對象 - 荊荊是個好姑娘的個人空間 -_函數體_15

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_16

類與對象 - 荊荊是個好姑娘的個人空間 -_初始化_17

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;
};

類與對象 - 荊荊是個好姑娘的個人空間 -_初始化_18

這有一個time作為成員變量,我不寫,會不會調用他的構造,會的,初始化列表是他定義的地方,每個成員都會區他定義的地方,哪怕不寫也會走初始化列表。 初始化列表就會去調用默認構造,如果沒有默認構造,只能這麼寫

類與對象 - 荊荊是個好姑娘的個人空間 -_#c++_19

就跟顯示調構造函數一樣,所以自定義類型成員我想顯示構造,不想調用默認構造,也可以這樣寫,

類與對象 - 荊荊是個好姑娘的個人空間 -_#c++_20

就算有默認構造,也可以這麼寫,我定義時候沒有調默認構造,就是説有默認構造時候我可以寫可以不寫,沒有默認構造時候我必須在這這麼寫。

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_21

類與對象 - 荊荊是個好姑娘的個人空間 -_函數體_22

這三個如果不走初始化列表就會報錯

類與對象 - 荊荊是個好姑娘的個人空間 -_#c++_23

初始化列表和函數體內能不能混着用,有些場景也必須混着用

類與對象 - 荊荊是個好姑娘的個人空間 -_初始化_24

假設我在這給了個指針,我可以在初始化列表malloc,不知道成功失敗,又不能在初始化列表看,就在函數體

類與對象 - 荊荊是個好姑娘的個人空間 -_初始化列表_25

初始化列表和函數體是可以打配合的

類與對象 - 荊荊是個好姑娘的個人空間 -_初始化列表_26

類與對象 - 荊荊是個好姑娘的個人空間 -_#c++_27

這是對象整體定義,對象裏面成員變量在初始化列表定義_day可以不寫,因為有些變量可以不初始化

類與對象 - 荊荊是個好姑娘的個人空間 -_#c++_28

_day是個隨機值,不確定的。

類與對象 - 荊荊是個好姑娘的個人空間 -_函數體_29

C++11也有這種寫法,這也不是定義,是聲明,空間開出來才是定義。後面是缺省值

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_30

如果初始化列表沒有寫那就缺省值初始化,寫了就用初始化列表顯示的值

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_31

如果我們不寫構造,編譯器會生成一個構造,生成的叫默認構造,因為他無參,不傳參,這時候年月日會初始化,按理內置類型不初始化C++11給了缺省值,自己寫了構造沒寫的地方初始化列表會用他,,默認生成也會用他

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_32

缺省值不僅可以給值,還可以給表達式。以後儘可能用初始化列表。因為走不走初始化列表,她都會走初始化列表,比如説寫了初始化列表,那他值定義時候就用初始化列表這個值,如果沒寫就看有沒有缺省值。  有缺省值就用缺省值初始化,如果沒有缺省值對於內置類型那就不確定了,可能隨機值,可能初始化0了,這個看編譯器。如果自定義類型那就調用默認構造,如果沒有默認構造那就報錯了。對於 引用 const必須在初始化列表初始化,

類與對象 - 荊荊是個好姑娘的個人空間 -_初始化_33

類與對象 - 荊荊是個好姑娘的個人空間 -_#c++_34

如果上面給了缺省值,下面缺省值的關係,

類與對象 - 荊荊是個好姑娘的個人空間 -_函數體_35

聲明時候不給值了,——day會不會初始化成1,不會,是不確定的,函數參數缺省值  是我有沒有顯示傳參,顯示傳參之後我就沒法用了,下面那個缺省值,是初始化列表沒寫的話自動用這個值,默認構造也有初始化列表,缺省值就是在初始化列表走的初始化列表和默認構造沒有關係,默認構造是穿不傳參的構造,初始化列表,哪個函數都會走的。沒有關係

類與對象 - 荊荊是個好姑娘的個人空間 -_#c++_36

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_37

_a1還沒初始化就用_a1沒問題,建立對象時候空間已經開好了,能訪問到的

先走a1初始化a2,a1是隨機之值,再初始化a1選D,按聲明順序走,生命順序實際是內存存放順序。

類與對象 - 荊荊是個好姑娘的個人空間 -_初始化_38

上面那個缺省值沒用,沒顯示傳雖然使用了缺省值,但是沒用缺省值初始化,進入這個函數之後

類與對象 - 荊荊是個好姑娘的個人空間 -_初始化列表_39

會走這裏,是初始化列表就用缺省值初始化。

類與對象 - 荊荊是個好姑娘的個人空間 -_#算法_40

就開好空間了

A aa,這是初始化,有空間但是不能存數據