默认初始化与零初始化

Jon*_*Mee 3 c++ default initialization zero

我无法理解 gcc 4.8.1 或 Visual Studio 2015 在默认初始化与值初始化方面的行为。

我试图自己理解这些之间的差异并可能遇到编译器错误并没有帮助?

我的问题是:有人可以解释这种行为吗?最好告诉我应该发生什么。

我有两个班级:

class Foo{
    int _bar;
public:
    void printBar(){ cout << _bar << endl; }
};

class bar{
    int ent;
public:
    int getEnt(){return ent;}
};
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码进行测试:

int main()
{
    Foo foo;

    foo.printBar();
    Foo().printBar();

    bar b;

    cout << b.getEnt() << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 gcc 和 Visual Studio 上,我得到:

134514795
0
0

现在,如果我将测试代码更改为:

int main()
{
    Foo foo;

    foo.printBar();

    bar b;

    cout << b.getEnt() << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc 给了我:

0
0

Visual Studio 给了我:

50790236
51005888

Mik*_*our 7

像这样没有用户定义的构造函数的类的默认初始化什么都不做,给每个平凡的成员留下一个不确定的值。

值初始化将对每个成员进行零初始化。

在第一种情况下,您正在打印:

  • 默认初始化的不确定值 Foo foo;
  • 初始化值的零值 Foo()
  • 默认初始化的不确定值 bar b;

第三个恰好为零;也许是因为它重用了临时 value-initialised 的存储Foo

在第二种情况下,您正在打印两个默认初始化对象的不确定值。巧合的是,它们在一种情况下为零值,但在另一种情况下没有。

这两个程序都有未定义的行为,因为它们使用未初始化的值。


Die*_*ühl 5

逻辑很简单:

  1. 类的默认初始化只是默认初始化所有成员。
  2. 内置类型的默认初始化使成员未初始化。
  3. 访问未初始化的对象会产生未定义的行为
  4. 未定义的行为可以做任何它想做的事。
  5. 两个编译器都提供“正确”的结果。注意,使鼻魔喷出也是正确的。