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
像这样没有用户定义的构造函数的类的默认初始化什么都不做,给每个平凡的成员留下一个不确定的值。
值初始化将对每个成员进行零初始化。
在第一种情况下,您正在打印:
Foo foo;
Foo()
bar b;
第三个恰好为零;也许是因为它重用了临时 value-initialised 的存储Foo
。
在第二种情况下,您正在打印两个默认初始化对象的不确定值。巧合的是,它们在一种情况下为零值,但在另一种情况下没有。
这两个程序都有未定义的行为,因为它们使用未初始化的值。
归档时间: |
|
查看次数: |
1975 次 |
最近记录: |