假设我有这样一个类:
class X {
public:
int x;
};我看到,如果我在本地创建X的一个实例,只有在全局创建的情况下,x才不会被初始化为0。
这是否意味着编译器没有为本地创建的对象合成默认构造函数(我怀疑它),或者它将被合成但不会将x值清零,如果是这样,为什么会这样呢?
发布于 2011-05-10 04:50:46
C++中的构造函数通常不会将成员初始化为0。您必须显式地使用值初始化成员。
在全局情况下,内存为零的原因是因为静态内存在发生任何其他事情之前被初始化为零。在您的例子中,隐式生成的默认构造函数在之后被调用,它不会触及成员X的内存。
另请参阅德里克的回答:Is global memory initialized in C++?
但是,请注意,结构化的非POD成员(类和结构)的默认构造函数确实会自动由默认构造函数调用。默认情况下,它只保留POD成员。
发布于 2011-05-10 05:53:18
X获得一个合成的构造函数,但是合成的构造函数不会对原语进行零初始化。
发布于 2011-05-10 04:56:48
您正在将对象构造的概念与成员初始化结合起来。一般来说,不要期望C++为您初始化原始数据成员,您需要自己完成(最好是通过构造函数后面的初始化列表)。
这主要是为了提高速度,因为这允许在不进行初始化的情况下进行分配,例如,如果您稍后要计算数据成员的值并覆盖任何“默认值”,这将非常有用。
我发现这个网站在过去是一个很有用的参考:http://www.cplusplus.com/doc/tutorial/variables/
https://stackoverflow.com/questions/5942328
复制相似问题