Constructor to specify zero-initialization of all builtin members?(构造函数指定所有内置成员的零初始化?)
问题描述
类的构造函数是否有更简单的方法来指定内置类型的所有成员都应该进行零初始化?
Is there a simpler way for a class's constructor to specify that all members of built-in type should be zero-initialized?
此代码片段出现在另一篇文章中:
This code snippet came up in another post:
struct Money
{
    double amountP, amountG, totalChange;
    int twenty, ten, five, one, change;
    int quarter, dime, nickel, penny;
    void foo();
    Money()  {}
};
事实证明,问题在于该对象是通过 Money mc; 实例化的,而变量未初始化.
and it turned out that the problem was that the object was instantiated via Money mc; and the variables were uninitialized.
推荐的解决方案是添加以下构造函数:
The recommended solution was to add the following constructor:
Money::Money()
  : amountP(), amountG(), totalChange(),
    twenty(), ten(), five(), one(), change()
    quarter(), dime(), nickel(), penny()
{
}
但是,这很丑陋且不便于维护.添加另一个成员变量并忘记将其添加到构造函数中的长列表很容易,当未初始化的变量突然停止获取 0 时,可能会导致几个月后难以发现的错误碰巧.
However, this is ugly and not maintenance-friendly. It would be easy to add another member variable and forget to add it to the long list in the constructor, perhaps causing a hard-to-find bug months down the track when the uninitialized variable suddenly stops getting 0 by chance.
推荐答案
您可以使用子对象进行整体初始化.会员可以工作,但您需要获得所有访问权限.所以继承更好:
You can use a subobject to initialize en masse. A member works, but then you need to qualify all access. So inheritance is better:
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
Demonstration (placement new is used to make sure the memory is non-zero before object creation): http://ideone.com/P1nxN6
与问题中的代码略有不同:http://ideone.com/n4lOdj
Contrast with a slight variation on the code in the question: http://ideone.com/n4lOdj
在上述两个演示中,double 成员被删除以避免可能的无效/NaN 编码.
In both of the above demos, double members are removed to avoid possible invalid/NaN encodings.
这篇关于构造函数指定所有内置成员的零初始化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:构造函数指定所有内置成员的零初始化?
				
        
 
            
        - C++ 协变模板 2021-01-01
 - Stroustrup 的 Simple_window.h 2022-01-01
 - 如何对自定义类的向量使用std::find()? 2022-11-07
 - 使用/clr 时出现 LNK2022 错误 2022-01-01
 - STL 中有 dereference_iterator 吗? 2022-01-01
 - 近似搜索的工作原理 2021-01-01
 - 与 int by int 相比,为什么执行 float by float 矩阵乘法更快? 2021-01-01
 - 一起使用 MPI 和 OpenCV 时出现分段错误 2022-01-01
 - 静态初始化顺序失败 2022-01-01
 - 从python回调到c++的选项 2022-11-16
 
						
						
						
						
						
				
				
				
				