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

时间:2014-04-09 22:35:56

标签: 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时,可能会导致难以找到的错误数月。

3 个答案:

答案 0 :(得分:8)

对于在C ++ 98中工作的内容,您可以使用Boost' value_initialized :( live example

#include <boost/utility/value_init.hpp>
...
struct Money
{
    boost::value_initialized<double> amountP, amountG, totalChange;
    boost::value_initialized<int> twenty, ten, five, one, change;
    boost::value_initialized<int> quarter, dime, nickel, penny;

    void foo();
    Money()  {/*every member is 0*/}
};

答案 1 :(得分:8)

您可以使用子对象初始化整体。会员工作,但您需要限定所有访问权限。所以继承更好:

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 */
};

演示(placement new用于确保在创建对象之前内存不为零):http://ideone.com/P1nxN6

与问题中的代码略有不同:[{3}}

在上述两个演示中,double成员都被删除,以避免可能的无效/ NaN编码。

答案 2 :(得分:2)

您可以按以下方式使用默认构造函数

Money m = {};

或者您可以在类定义中设置数据成员的初始化:

struct Money
{
    double amountP = 0.0, amountG = 0.0, totalChange = 0.0;
    int twenty = 0, ten = 0, five - 0, one = 0, change = 0;
    int quarter = 0, dime = 0, nickel = 0, penny = 0;

    void foo();
    Money()  {}
};