7

我发现很多文章解释了“默认初始化和值初始化”之间的区别,但实际上我并没有理解清楚。

这是一个例子:

class A{
   public:
      int x;
};


int main(){
    A a;// default initialization so x has undefined value.
    A b = A(); // value initialization so x is a scalar thus it is value initialized to 0

}

正如我猜想的那样,上面是可以的,但在这里:

int value = 4; // is this considered a value-initialization?

请帮助我了解两种初始化形式之间的主要区别。

4

1 回答 1

4

A a;默认初始化,因为效果默认构造函数A用于初始化。由于隐式生成的默认构造函数A执行任何操作,a.x因此具有不确定的值。

A()值初始化

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

注意与默认初始化的区别,A有一个隐式定义的默认构造函数,并且对象是零初始化的;所以x临时对象的数据成员A()将被初始化为0.

A b = A();拷贝初始化,概念b上是从临时对象初始化的A(),所以b.x也会被初始化为0。请注意,由于复制省略,因为 C++17b保证直接进行值初始化;复制/移动构造被省略。

int value = 4;也是复制初始化value将被初始化为4.

于 2019-06-27T01:22:38.633 回答