13构造函数的初始化列表

构造函数的初始化列表

  • 构造函数的初始化列表是一种特殊的初始化方式,用于在构造函数中初始化类的成员变量。
  • 参数化列表初始化相当于一步初始化,构造函数内初始化相当于先定义再初始化。
  • 初始化列表的初始化顺序应与成员变量的声明顺序一致,否则可能出现问题。
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;
}
posted @ 2024-01-16 10:44  SIo_2  阅读(10)  评论(0)    收藏  举报