更新:我正在寻找是否有一种方法可以一次将整个类初始化为零,因为从技术上讲,人们可能会忘记在每个成员之后添加一个 ' = 0
' 或 ' '。{}
其中一条评论提到,显式默认的无参数 c-tor 将在表单的值初始化期间启用MyClass c{};
零初始化。查看http://en.cppreference.com/w/cpp/language/value_initialization我无法确定哪些语句指定了这一点。
初始化现在是一个复杂的话题,因为 C++11 已经改变了各种初始化结构的含义和语法。我无法从其他问题中收集到足够好的信息。但是,例如,请参阅编写默认构造函数强制零初始化?.
我面临的具体问题是:我想确保我的类的成员对于 (1) 声明默认 c-tor 的类和 (2) 没有声明默认 c-tor 的类都清零。
对于 (2),初始化 with{}
完成了这项工作,因为它是值初始化的语法,它转换为零初始化,或者如果您的类是聚合的,则聚合初始化 - 在没有提供初始化程序的成员的情况下(全部! ) 是零初始化的。
但是对于(1)我仍然不确定什么是最好的方法。从我收集的所有信息中我了解到,如果您提供默认的 c-tor(例如,用于将某些成员设置为某些值),您必须将剩余成员显式归零,否则语法MyClass c = MyClass();
或 C++11MyClass c{};
将无法完成这项工作. 换句话说,在这种情况下,值初始化意味着只调用你的 c-tor,就是这样(没有归零)。
如果您声明一个接受值的 c-tor 并将这些值设置为成员的子集,您会遇到同样的情况,但您希望其他成员为零:没有简写方式 - 我正在考虑 3 个选项:
class MyClass
{
int a;
int b;
int c;
MyClass(int a)
{
this->a = a;
// now b and c have indeterminate values, what to do? (before setting 'a')
// option #1
*this = MyClass{}; // we lost the ability to do this since it requires default c-tor which is inhibited by declaring this c-tor; even if we declare one (private), it needs to explicitly zero members one-by-one
// option #2
std::memset(this, 0, sizeof(*this)); // ugly C call, only works for PODs (which require, among other things, a default c-tor defaulted on first declaration)
// option #3
// don't declare this c-tor, but instead use the "named constructor idiom"/factory below
}
static MyClass create(int a)
{
MyClass obj{}; // will zero-initialize since there are no c-tors
obj.a = a;
return obj;
}
};
我的推理正确吗?你会选择 3 个选项中的哪一个?