构造函数来指定所有内置成员的零初始化
Constructor to specify zero-initialization of all builtin members?
类的构造函数有没有一种更简单的方法来指定所有内置类型的成员都应该为零初始化?
这个代码片段出现在另一篇文章中:
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() {}
};
相关文章:
- C++成员初始化
- c++构造函数成员初始化:传递参数
- C++正确的指针成员初始化
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- WinLamb 错误:成员初始化非法
- 使用其他成员初始化结构的成员?
- C++模板类静态成员初始化
- 解释了构造函数成员初始化列表
- 如何在成员初始化列表中声明共享指针
- C++入门5版:使用get成员初始化另一个与shared_ptr无关的对象
- C++11 默认类成员初始化与初始值设定项列表同时
- 调用非默认构造函数作为成员初始化
- C++模板成员初始化:用右值移动构造,但用左值移动引用
- 类成员初始化C++
- 在成员初始化列表中,我可以创建对列表中不在列表中的成员变量的引用
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 如何调用成员初始化器列表中参考成员的构造函数
- C 构造函数采用成员初始化器
- 与其他静态const成员初始化静态常量成员
- 静态内联成员初始化顺序