构造函数的初始化列表
- 构造函数的初始化列表是一种特殊的初始化方式,用于在构造函数中初始化类的成员变量。
 
- 参数化列表初始化相当于一步初始化,构造函数内初始化相当于先定义再初始化。
 
- 初始化列表的初始化顺序应与成员变量的声明顺序一致,否则可能出现问题。
 
class Date {
public:
    Date(int y, int m, int d);
private:
    int _year;
    int _month;
    int _day;
};
Date::Date(int y, int m, int d):
    _year(y), _month(m), _day(d)
{}
class Goods {
public:
    Goods(const char* name, int amount, double price, int y, int m, int d);
private:
    char* _name;
    int _amount;
    double _price;
    Date date;  //成员对象,需要使用参数化列表对其初始化
};
Goods::Goods(const char* name, int amount, double price, int y, int m, int d) :
    //相当于初始化成员变量时直接赋值
    _amount(amount), _price(price), date(y, m, d) {
    //构造函数内对成员变量赋值,相当于定义好了成员变量后再赋值
    _name = new char[strlen(name) + 1];
    strcpy(_name, name);
    //date = Date(y,m,d); 如果不使用参数化列表,这样写也会有问题,因为date要先默认初始化,可能没有这个默认初始化函数。
}
int main() {
    Goods("nn", 100, 20.0, 2000, 3, 7);
}
class Test{
public:
    Test(int x):a(x), b(a){} //没问题
    Test(int x):b(x), a(b){} //有问题,初始化顺序应该是a,b
private:
    int a;
    int b;
}