我对何时以及如何在构造函数中初始化类的成员有点困惑。如果我理解正确,您可以通过在类定义中包含默认值、构造函数成员初始化程序列表或通过构造函数主体中的赋值来完成此操作。我意识到最好在进入构造函数的主体之前进行初始化,但是什么时候应该使用成员初始化器列表,什么时候应该使用默认值?
如果我在这里从根本上误解了某些东西,我深表歉意。
我对何时以及如何在构造函数中初始化类的成员有点困惑。如果我理解正确,您可以通过在类定义中包含默认值、构造函数成员初始化程序列表或通过构造函数主体中的赋值来完成此操作。我意识到最好在进入构造函数的主体之前进行初始化,但是什么时候应该使用成员初始化器列表,什么时候应该使用默认值?
如果我在这里从根本上误解了某些东西,我深表歉意。
你真的让事情有点混乱。至少有4个不同的概念
你做了3个。
在以下示例中(在 ideone.com 上),为了简洁/简单,我使用struct
代替和内联构造函数。class
#include <iostream>
struct A
{
A(int v=1): m(v) {}
int m;
};
struct B
{
B(): m(2) {}
int m;
};
struct C
{
C()
{
m = 3;
}
int m;
};
// since C++11
struct D
{
int m = 11;
};
int main()
{
using namespace std;
#define TRACE(arg) cout << #arg ": " << arg.m << endl;
A a1;
TRACE(a1)
A a2(4);
TRACE(a2)
B b;
TRACE(b)
b.m = 5;
TRACE(b)
C c;
TRACE(c)
c.m = 6;
TRACE(c)
D d;
TRACE(d)
d.m = 0;
TRACE(d)
#undef TRACE
}
的用法与和的用法A
不同。B
C
D
仅A
提供一种m
使用默认值以外的值进行初始化的方法。所有变体都提供直接访问m
(大多不是一个好的选择,将其视为一个占位符,以更复杂的方式修改成员)。如果无法访问实际的初始化程序值,则必须修改对象。这使得m
的常量对象B
,C
并且D
有效地成为编译时常量。如果可以使用初始化列表 (或) C
,则应避免构造函数主体 ( ) 中的成员“初始化” (有时这并不像此处所示的那么简单)。A
B
D
如果您使用 C++11 或更高版本,则应估计选项。
所以A
似乎是最灵活的选择。但这不是初始化两个或更多成员的好模式:混淆参数顺序太容易了。
[1]在我(感谢NikosC)意识到这个选项存在之后添加了这个选项