c++ - 指定所有内置成员的零初始化的构造函数?

标签 c++ constructor initialization built-in-types

是否有更简单的方法让类的构造函数指定内置类型的所有成员都应进行零初始化?

此代码片段出现在另一篇文章中:

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/

相关文章:

c++ - 用一个 int 替换多个 bool 并使用位掩码的性能优势?

c++ - 尝试在声明中仅使用类名构造临时对象

swift - 如何初始化一个新的 NSManagedObject 并在单个托管对象上下文中设置与另一个 NSManagedObject 的关系?

c++ - GTKmm + pipe() 不工作

c++ - 什么时候为对象设置虚拟表指针(在 C++ 中)?

c++ - 如何区分参数为非嵌套和嵌套 initializer_list 的两个重载函数?

c++ - 代码重构尝试使用多态性和 std::map

java - 我是否需要像在 C++ 中那样将 Java 对象引用初始化为 null

arrays - 如何在编译时初始化一个由先前定义的数组组成的数组?

c++ - C++避免将NULL比较为0