为什么“default”构造函数对类成员进行零初始化?

vla*_*don 2 c++ default-constructor value-initialization

给定两个具有不同构造函数的类:

#include <iostream>

struct A {
    int x;

    A() {};
};

struct B {
    int x;

    B() = default;
};

int main() {
    int x = 5;
    x = 7;

    printf("before: %d\n", x);

    new(&x) A();
    printf("%d\n", x);

    new(&x) B();
    printf("%d\n", x);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

before: 7
7
0
Run Code Online (Sandbox Code Playgroud)

为什么defaultctor 会进行零初始化int x

Fra*_*eux 6

您使用的值初始化( ) 与默认初始化( )new A();不同。注意括号。new A;

对于值初始化:

如果 T 是没有默认构造函数或具有用户提供或删除的默认构造函数的类类型,则该对象被默认初始化;

和 :

如果 T 是一个具有既不是用户提供的也不是删除的默认构造函数的类类型(也就是说,它可能是一个具有隐式定义或默认默认构造函数的类),则该对象为零初始化,然后它是默认的 -如果它有一个重要的默认构造函数,则进行初始化;

并且,关于“用户提供”的定义:

如果函数是用户声明的并且在第一次声明时未显式默认或删除,则该函数是用户提供的。

A有用户提供的构造函数,因此它属于第一种情况。只是调用其构造函数,该构造函数不初始化任何内容。

B的构造函数是显式默认的,因此它不是用户提供的,也不会被删除,因此属于第二种情况。它先为零初始化,然后默认初始化。