假设:
class Foo
{
public:
Foo();
Foo(typeA a);
private:
typeB b;
typeC c;
};
Foo::Foo(typeA a)
{
//do something with a, but nothing with b nor c.
}
int main()
{
typeA a;
Foo foo(a);
return 0;
}
这里会发生什么?是foo.b
并且foo.c
默认初始化吗?用这种方式定义构造函数是一种好习惯吗?
foo.b和foo.c是否默认初始化?
是的,数据成员将被隐式默认初始化。但是默认初始化的作用取决于要初始化的对象的类型。对于用户定义的类型,这意味着将调用其默认构造函数。对于内置或POD,这意味着将不执行初始化。因此,这取决于typeA
并且typeB
是:
如果它们是用户定义的类型,则将调用其默认构造函数。如果它们是内置的或PODS,则不会进行初始化。
用这种方式定义构造函数是一种好习惯吗?
假设您具有用户定义类型的数据成员,那么这更多地取决于惯例和编码标准。我已经看到它对两种方法都提出了争论:一方面,如果值初始化和隐式默认初始化做相同的事情(与用户定义的类型一样),为什么要显式地对值初始化数据成员进行赋值?可能会说您不知道自己在做什么。另一方面,为什么不对所有事情都明确?如果将数据类型从用户定义的类型更改为内置的类型,却忘记将其添加到构造函数的初始化列表中怎么办?我倾向于站在“我知道我在做什么”的角度,但这纯粹是个人的。
如果您的数据成员是内置的或POD,那么它实际上可以归结为您自己的代码的要求:您是否想对成员进行零初始化?通常您会这样做,但是这种初始化并非免费提供,在某些情况下可能很重要。这就是在C ++中默认情况下这些类型不会初始化为零的原因。因此,同样,没有明确的答案,但是在我处理过的大多数实际代码中,确实希望成员被零初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句