我写了以下代码片段:
void foo()
{
struct _bar_
{
int a;
} bar;
cout << "Value of a is " << bar.a;
}
并用 g++ 4.2.1 (Mac) 编译它。输出是“a 的值为 0”。
c++ 中结构体的数据成员总是默认初始化(与 c 相比),这是真的吗?或者观察到的结果只是巧合?
我可以想象 C++ 中的结构有一个默认构造函数(因为结构和类在 C++ 中几乎相同),这可以解释为什么 bar 的数据成员 a 初始化为零。
简单的答案是肯定的。
它有一个默认构造函数。
注意:结构和类是相同的(除了访问说明符的默认状态之外)。
但是否初始化成员将取决于实际对象的声明方式。在您的示例中,否,该成员未初始化并且a
具有不确定的价值。
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.
确切的细节在标准中进行了解释,网址为8.5 Initializers [dcl.init]
第4-10段。但以下是针对这种情况的简单总结。
没有用户定义构造函数的结构具有编译器生成的构造函数。但它的作用取决于它的使用方式,它要么默认初始化其成员(对于 POD 类型通常什么都没有),要么对其成员进行零初始化(对于 POD 通常意味着将其成员设置为零)。
附言。不要使用_
作为类型名称中的第一个字符。你会遇到问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)