2

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

#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);
}

输出是:

before: 7
7
0

为什么defaultctor 零初始化int x

4

1 回答 1

6

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

对于值初始化:

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

和 :

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

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

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

A有一个用户提供的构造函数,所以它属于第一种情况。只是调用它的构造函数,它什么都不初始化。

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

于 2021-11-01T15:30:57.037 回答