1. 深入理解C++构造函数初始化列表
在C++面向对象编程中,构造函数负责对象的初始化工作。传统上,我们习惯在构造函数体内通过赋值语句来初始化成员变量,但实际上C++提供了更高效的初始化方式——初始化列表。
1.1 初始化列表的基本语法
初始化列表的语法结构如下:
cpp复制ClassName(parameters) : member1(value1), member2(value2), ... {
// 构造函数体
}
让我们通过一个日期类的例子来对比两种初始化方式:
cpp复制// 传统函数体内赋值方式
class Date {
public:
Date() {
_year = 1;
_month = 1;
_day = 1;
}
private:
int _year;
int _month;
int _day;
};
// 使用初始化列表方式
class Date {
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{
}
private:
int _year;
int _month;
int _day;
};
注意:每个成员变量在初始化列表中只能出现一次,否则会导致编译错误。
1.2 必须使用初始化列表的情况
有三种特殊情况必须使用初始化列表:
- 引用类型成员变量
- const修饰的成员变量
- 没有默认构造函数的类类型成员
cpp复制class Time {
public:
Time(int hour) : _hour(hour) {
cout << "Time()" << endl;
}
private:
int _hour;
};
class Date {
public:
Date(int& x, int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
, _ret(x) // 引用成员必须初始化
, i(2) // const成员必须初始化
, _t(1) // 无默认构造的类成员必须初始化
{
}
private:
int _year;
int _month;
int _day;
int& _ret; // 引用成员
const int i; // const成员
Time _t; // 无默认构造的类成员
};
如果这些特殊成员不在初始化列表中初始化,编译器会直接报错。这一点在实际开发中尤为重要,特别是当类中包含引用或const成员时。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++11成员变量缺省值
C++11
