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偶然时,可能会导致难以找到的错误数月.
对于在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)
您可以使用子对象初始化整体.会员工作,但您需要限定所有访问权限.所以继承更好:
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编码.