让我说我有这个课程:
class X {
public:
int x;
};
我看到如果我在本地创建一个X实例,那么只有当我全局创建它时,x才会初始化为0。 这是否意味着默认构造函数不是由编译器合成的(我怀疑)对于创建localy的对象,或者它将被合成但不是x值的零,如果是这种情况,为什么会这样?
答案 0 :(得分:4)
C ++中的构造函数通常不会将成员初始化为0.您必须使用值显式初始化成员。
在全局情况下内存为零的原因是因为静态内存在发生任何其他事件之前被初始化为零。在您的情况下,隐式生成的默认构造函数随后被调用,它不会触及成员X的内存。
另见Derek的回答:Is global memory initialized in C++?
但是,请注意,结构化的非POD成员(类和结构)的默认构造函数会自动由默认构造函数调用。这只是POD成员默认单独使用。
答案 1 :(得分:2)
X
获取一个合成的构造函数,但是合成的构造函数 not 零初始化基元。
答案 2 :(得分:0)
您正在将对象构造的概念与成员初始化相结合。作为一般规则,不要指望C ++为您初始化原始数据成员,您需要自己执行此操作(最好通过构造函数之后的初始化列表。)
这主要是为了速度,因为这允许在没有初始化的情况下进行分配,例如,如果您稍后计算数据成员的值并覆盖任何“默认”值,这将非常有用。
我发现此网站过去很有用:http://www.cplusplus.com/doc/tutorial/variables/
答案 3 :(得分:-1)
默认构造函数不知道它应该初始化您的成员变量。如果你需要将x初始化为某个东西,你最好添加自己的构造函数来为你做这个:
class X {
public:
X() : x(0) { };
int x;
};