注意:我正在使用g ++编译器(我听说这是非常好的,并且应该非常接近标准).
我有一个我能想到的最简单的课程:
class BaseClass {
public:
int pub;
};
Run Code Online (Sandbox Code Playgroud)
然后我有三个同样简单的程序来创建BaseClass
对象并打印出他们数据的[未初始化]值.
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
Run Code Online (Sandbox Code Playgroud)
打印出:
B1.pub = 1629556548
Run Code Online (Sandbox Code Playgroud)
哪个好.我实际上认为它会被初始化为零,因为它是POD或Plain Old Datatype或类似的东西,但我想不是吗?到现在为止还挺好.
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
BaseClass B2;
cout<<"B2.pub = "<<B2.pub<<endl;
Run Code Online (Sandbox Code Playgroud)
打印出:
B1.pub = 1629556548
B2.pub = 0
Run Code Online (Sandbox Code Playgroud)
这绝对是奇怪的.我以相同的方式创建了两个相同的对象.一个被初始化而另一个没有.
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
BaseClass B2;
cout<<"B2.pub = "<<B2.pub<<endl;
BaseClass* pB3 = new BaseClass;
cout<<"B3.pub = "<<pB3->pub<<endl;
Run Code Online (Sandbox Code Playgroud)
打印出:
B1.pub = 0
B2.pub = 0
B3.pub = 0
Run Code Online (Sandbox Code Playgroud)
这是最奇怪的.它们都被初始化为零.我所做的只是添加两行代码,它改变了以前的行为.
那么这只是"未初始化的数据导致未指明的行为"的情况,还是"引擎盖下"更合乎逻辑?
我真的想了解默认的构造函数/析构函数行为,因为我觉得完全理解继承的东西非常重要.