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