我写了以下代码片段:
void foo()
{
struct _bar_
{
int a;
} bar;
cout << "Value of a is " << bar.a;
}
Run Code Online (Sandbox Code Playgroud)
并用g ++ 4.2.1(Mac)编译它.输出为"a的值为0".
是否真的说c ++中的结构的数据成员默认是初始化的(与c相比)?或者观察到的结果是巧合吗?
我可以想象c ++中的结构有一个默认的构造函数(因为结构和类在c ++中几乎相同),这可以解释为什么bar的数据成员a初始化为零.
Mar*_*ork 50
简单的答案是肯定的.
它有一个默认的构造函数.
注意:struct和class是相同的(除了访问说明符的默认状态).
但它是否初始化成员将取决于实际对象的声明方式.在您的示例中,没有成员未初始化且具有不确定的值.
void func()
{
_bar_ a; // Members are NOT initialized.
_bar_ b = _bar_(); // Members are zero-initialized
// From C++14
_bar_ c{}; // New Brace initializer (Members are zero-initialized)
_bar_* aP = new _bar_; // Members are NOT initialized.
_bar_* bP = new _bar_(); // Members are zero-initialized
// From C++14
_bar_ cP = new _bar_{}; // New Brace initializer (Members are zero-initialized)
}
// static storage duration objects
// i.e. objects at the global scope.
_bar_ c; // Members are zero-initialized.
Run Code Online (Sandbox Code Playgroud)
具体细节在8.5 Initializers [dcl.init]第4-10段的标准中解释.但以下是对这种情况的简单总结.
没有用户定义构造函数的结构具有编译器生成的构造函数.但它的作用取决于它是如何使用的,它将默认初始化其成员(对于POD类型通常没有)或者它可能零初始化其成员(对于POD通常意味着将其成员设置为零).
PS.不要将a _用作类型名称中的第一个字符.你会碰到问题.
Alo*_*ave 10
是否真的说c ++中的结构的数据成员默认是初始化的(与c相比)?或者观察到的结果是巧合吗?
这是巧合.
您的代码调用未定义的行为; 除非你明确地将成员设置为0他们可以是任何东西.