? ? ? ? C++中,構造函數為成員變量賦值的方法有兩種:構造函數體賦值和初始化列表。
? ? ? ? 構造函數體賦值是在構造函數里面為成員變量賦值,如:
class Data
{
public://構造函數體賦值Data(int year,int month,int day){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;
};
? ? ? ? 但是,構造函數體賦值其實是先調用成員變量的默認構造函數進行初始化,再在構造函數體內通過賦值運算符重新賦值,相當于執行了“默認構造+賦值”兩步。因此,其本質還是賦值,而不是初始化。因為初始化只能初始化一次,而構造函數體內可以多次賦值。
? ? ? ? 函數體中多次賦值舉例:
class A
{
public://結果為最后一次賦值的結果A(int a = 0){_a = a;_a += 2;if (_a > 1){_a *= 10;}}private:int _a;
};
? ? ? ? 而初始化列表是在進入構造函數體之前,就會完成對成員變量的初始化。
? ? ? ? 初始化列表在構造函數的括號后面,以冒號開頭,用逗號分隔成員變量,每個成員變量后面跟一個小括號,里面放初始值。
class Data
{
public://初始化列表Data(int year, int month, int day):_year(year), _month(month), _day(day){//里面可以根據需求進行賦值操作}private:int _year;int _month;int _day;
};
? ? ? ? 初始化列表有很重要的作用,當有些構造函數體賦值無法完成給變量賦初值的操作時,就要用到初始化列表。比如const修飾的成員變量、引用成員變量、自定義類型成員。const修飾的成員變量只能初始化,不能賦值修改;引用成員變量在定義時必須指明時誰的別名;自定義類型成員要調用對應的構造函數。而類中的成員變量只是聲明,不能直接賦值。
class A
{
public:A(int a = 10):_a(a){ }private:int _a;
};class B
{
public:B(int& ref):_aobj(1),_ref(ref), _n(20){}private:A _aobj;//寫在初始化列表會調用它自己的構造函數;不寫,就必須要有對應的默認構造函數 int& _ref;const int _n;int x;//內置類型寫上會初始化為對應值,不寫上就是隨機值
};
? ? ? ? 成員變量在類中聲明次序就是其在初始化列表中的初始化順序,與其在初始化列表中的先后順序無關。
class A
{
public:A(int a = 0):_a1(a)//后初始化,_a2(_a1)//先初始化,結果為隨機值{}private:int _a2;int _a1;
};int main()
{A aa1(10);return 0;
}