gpt4 book ai didi

c++ - 默认构造函数是否初始化内置类型?

转载 作者:IT老高 更新时间:2023-10-28 11:30:02 31 4
gpt4 key购买 nike

默认构造函数(由编译器创建)是否初始化内置类型?

最佳答案

隐式定义(由编译器)类的默认构造函数不会初始化内置类型的成员。

但是,您必须记住,在某些情况下,可以通过其他方式执行类实例的初始化。不是默认构造函数,也不是构造函数。

例如,人们普遍认为 C 类是错误的。语法 C()总是调用默认构造函数。但实际上,语法 C()执行类实例的所谓值初始化。如果它是用户声明的,它只会调用默认构造函数。 (那是在 C++03 中。在 C++98 中 - 仅当类是非 POD 时)。如果类没有用户声明的构造函数,那么 C()不会调用编译器提供的默认构造函数,而是执行一种不涉及 C 的构造函数的特殊类型的初始化。一点也不。相反,它将直接对类的每个成员进行值初始化。对于内置类型,它会导致零初始化。

例如,如果你的类没有用户声明的构造函数

class C { 
public:
int x;
};

然后编译器将隐式提供一个。编译器提供的构造函数什么都不做,这意味着它不会初始化 C::x

C c; // Compiler-provided default constructor is used
// Here `c.x` contains garbage

尽管如此,以下初始化零初始化x因为他们使用显式 ()初始化器

C c = C(); // Does not use default constructor for `C()` part
// Uses value-initialization feature instead
assert(c.x == 0);

C *pc = new C(); // Does not use default constructor for `C()` part
// Uses value-initialization feature instead
assert(pc->x == 0);

() 的行为C++98 和 C++03 之间的初始化程序在某些方面有所不同,但在这种情况下不同。对于以上类(class)C相同:()初始化程序执行 C::x 的零初始化.

另一个不涉及构造函数的初始化示例当然是聚合初始化

C c = {}; // Does not use any `C` constructors at all. Same as C c{}; in C++11.
assert(c.x == 0);

C d{}; // C++11 style aggregate initialization.
assert(d.x == 0);

关于c++ - 默认构造函数是否初始化内置类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2417065/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com