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

最佳答案

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

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

例如,人们普遍认为,对于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之间,()初始化程序的行为在某些方面有所不同,但在这种情况下没有差别。对于上面的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);

09-10 04:49
查看更多