构造函数的初始化列表
- 构造函数的初始化列表是一种特殊的初始化方式,用于在构造函数中初始化类的成员变量。
- 参数化列表初始化相当于一步初始化,构造函数内初始化相当于先定义再初始化。
- 初始化列表的初始化顺序应与成员变量的声明顺序一致,否则可能出现问题。
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;
}