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

Constructor to specify zero-initialization of all builtin members?

本文关键字:成员 初始化 内置 构造函数      更新时间:2023-10-16

类的构造函数有没有一种更简单的方法来指定所有内置类型的成员都应该为零初始化?

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

struct Money
{
    double amountP, amountG, totalChange;
    int twenty, ten, five, one, change;
    int quarter, dime, nickel, penny;
    void foo();
    Money()  {}
};

结果发现问题是对象是通过CCD_ 1实例化的,并且变量未初始化。

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

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

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

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()  {}
};