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

M.M*_*M.M 4 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()  {}
};
Run Code Online (Sandbox Code Playgroud)

事实证明,问题是对象是通过实例化Money mc;而变量未初始化的.

建议的解决方案是添加以下构造函数:

Money::Money()
  : amountP(), amountG(), totalChange(),
    twenty(), ten(), five(), one(), change()
    quarter(), dime(), nickel(), penny()
{
}
Run Code Online (Sandbox Code Playgroud)

但是,这很丑陋而且不便于维护.添加另一个成员变量并忘记将其添加到构造函数中的长列表中会很容易,当未初始化的变量突然停止0偶然时,可能会导致难以找到的错误数月.

chr*_*ris 8

对于在C++ 98中工作的东西,你可以使用Boost value_initialized:( 实例)

#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*/}
};
Run Code Online (Sandbox Code Playgroud)


Ben*_*igt 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 */
};
Run Code Online (Sandbox Code Playgroud)

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

与问题中的代码略有不同:http://ideone.com/n4lOdj

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

  • 警告:在C++ 98中,如果`MoneyData`也包含非POD成员(例如`std :: string`),那么突然,`int`和`double`成员不再被零初始化. (3认同)
  • @Destructor在C++ 98中,您的代码通过读取未初始化的变量导致未定义的行为,因此任何输出都符合标准.相关子句是8.5/7"初始化器为`()`的对象应默认初始化.",8.5/5定义*default-initialized*"如果`T`是非POD类类型,则默认`T`的构造函数被称为",而12.1/7表示隐式声明的默认构造函数的行为就好像它有一个空的函数体.12.6/4表示非类型的非静态数据成员,没有初始化程序,不会被构造函数初始化. (3认同)
  • 在C++ 03中,它被更改,以便`()`递归地初始化聚合,无论它是否为POD (3认同)