一、再探构造函数
1 构造函数体初始化列表
与其他函数一样,构造函数具有名字、形参表和函数体,与其他函数不同的是,构造函数还可以包含一个构造函数初始化列表:
如下:
class Time
{
public:
Date(int hour, int minute, int second)
: _hour(hour)
, _minute(minute)
, _second(second)
{
}
private:
int _hour;
int _minute;
int _hour;
};
在许多类中,初始化和赋值都是低效率的:数据成员可能已经被直接初始化了,还要对他进行初始化和赋值。比效率更重要的是:
- 引用成员变量
-
- const成员变量
-
- 自定义类型成员(该类无默认构造函数)
以上必须初始化,因此使用构造函数初始化列表可以避免许多编译错误。
2 成员初始化次序
- 每个成员在构造函数初始化列表中只能指定一次,造函数初始化列表仅指定用于初始化成员的值,并不指定这些初始化执行的次序。
例如:(再考虑)
class x{
int i;
int j;
public:
x(int val)
:j(val)
,i(j)
{
}
}
看似是 val初始化j,j初始化i,实际上先初始化i,此时j的值为随机值,再初始化j时,已经跟i没有关系了。
因此,尽可能避免用一个成员初始化另一个成员,如遇到上述条件,那成员初始化次序至关重要。