考虑到这个程序:
#include <iostream>
class C
{
public:
C(void): a(1)
{ a=2; }
int a{3};
};
int main(void)
{
C c{};
std::cout << c.a; // 2
}
我可以看到三种形式的数据成员初始化:
- 使用成员初始化器列表
- 使用构造函数
- 在类主体中使用声明
什么时候用哪个?
考虑到这个程序:
#include <iostream>
class C
{
public:
C(void): a(1)
{ a=2; }
int a{3};
};
int main(void)
{
C c{};
std::cout << c.a; // 2
}
我可以看到三种形式的数据成员初始化:
什么时候用哪个?
1:在类体中使用声明
当成员将始终使用相同的值初始化时,您应该使用它,并且必须为每个构造函数显式编写它是没有意义的。
2:使用成员初始化器列表
对于缺少默认构造函数的成员,成员初始化器列表显然是必需的,但除此之外,如果您正在基于构造函数初始化成员,那么在这里执行它是有意义的。
3:使用构造函数体
构造函数体对于无法在单个语句中(在 init-list 中)执行的逻辑更有用。但是,我认为在成员初始化器列表或构造器主体中初始化 POD 并没有太大区别。
我的建议是使用:
int a{3};
这确保无论您在类中有多少构造函数,都a
将其初始化。3
我的第二个选择是使用成员初始化列表。
c(void) : a(1) {}
第三个选项,使用代码设置成员变量的值,应该避免。