是否有更简单的方法让类的构造函数指定内置类型的所有成员都应进行零初始化?
此代码片段出现在另一篇文章中:
struct Money
{
double amountP, amountG, totalChange;
int twenty, ten, five, one, change;
int quarter, dime, nickel, penny;
void foo();
Money() {}
};
事实证明,问题是对象是通过 Money mc;
实例化的,而变量未初始化。
推荐的解决方案是添加以下构造函数:
Money::Money()
: amountP(), amountG(), totalChange(),
twenty(), ten(), five(), one(), change()
quarter(), dime(), nickel(), penny()
{
}
但是,这很丑陋,而且不便于维护。添加另一个成员变量很容易忘记将其添加到构造函数的长列表中,当未初始化的变量突然停止获取 0
时,可能会导致几个月后难以发现的错误机缘巧合。
最佳答案
您可以使用子对象来整体初始化。一个成员可以工作,但是您需要限定所有访问权限。所以继承比较好:
struct MoneyData
{
double amountP, amountG, totalChange;
int twenty, ten, five, one, change;
int quarter, dime, nickel, penny;
};
struct Money : MoneyData
{
void foo();
Money() : MoneyData() {} /* value initialize the base subobject */
};
演示(放置 new
用于确保对象创建前内存非零):http://ideone.com/P1nxN6
对比问题中代码的细微变化:http://ideone.com/n4lOdj
在上述两个演示中,double
成员被删除以避免可能的无效/NaN 编码。
关于c++ - 指定所有内置成员的零初始化的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22975262/