c ++结构是否有默认构造函数?

mor*_*eus 38 c++

我写了以下代码片段:

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 _用作类型名称中的第一个字符.你会碰到问题.

  • @rubenvb:其实这不是真的.阅读:[什么是规则 - 关于使用下划线的交流标识符](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using- an-underscore-in-ac-identifier/228797#228797)问题是大多数人不知道确切的规则并且犯错误.所以最好在标识符的开头避免使用它们.这里:在全局范围内保留下划线后跟任何字母. (5认同)

Alo*_*ave 10

是否真的说c ++中的结构的数据成员默认是初始化的(与c相比)?或者观察到的结果是巧合吗?

这是巧合.

您的代码调用未定义的行为; 除非你明确地将成员设置为0他们可以是任何东西.

  • "未指定"或"未定义"?`bar.a`是一个有效的变量,它只是在一个不确定的状态. (6认同)
  • @KerrekSB:`bar.a`是一个带有"Undefined Value"的有效变量. (2认同)