【发布时间】:2011-07-26 02:09:48
【问题描述】:
注意:我使用的是 g++ 编译器(我听说它非常好,应该非常接近标准)。
我有我能想到的最简单的类:
class BaseClass {
public:
int pub;
};
然后我有三个同样简单的程序来创建 BaseClass 对象并打印出它们数据的 [未初始化] 值。
案例一
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
打印出来:
B1.pub = 1629556548
这很好。我实际上认为它会被初始化为零,因为它是 POD 或普通旧数据类型或类似的东西,但我猜不是?到目前为止一切顺利。
案例2
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
BaseClass B2;
cout<<"B2.pub = "<<B2.pub<<endl;
打印出来:
B1.pub = 1629556548
B2.pub = 0
这绝对是奇怪的。我以完全相同的方式创建了两个相同的对象。一个被初始化,另一个没有。
案例3
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;
打印出来:
B1.pub = 0
B2.pub = 0
B3.pub = 0
这是迄今为止最奇怪的。它们都被初始化为零。我所做的只是添加两行代码,它改变了以前的行为。
这只是“未初始化的数据导致未指定的行为”的情况,还是“幕后”发生了更合乎逻辑的事情?
我真的很想了解默认的构造函数/析构函数行为,因为我觉得这对于完全理解继承的东西非常重要..
【问题讨论】:
-
在 C++ 中读取这些未初始化的对象实际上是未定义的行为。
标签: c++ initialization