C ++默认初始化类型

时间:2017-07-24 21:10:59

标签: c++ initialization c++14 default-value

为什么这两个场景(A和C的初始化)在C ++ 14中产生不同的默认初始化结果? 我根据cppreference.com中的默认初始化规则无法理解结果

struct A { int m; };
struct C { C() : m(){};  int m; };  

int main() {
  A *a, *d;
  A b;
  A c{};
  a=new A();
  d=new A;
  cout<<a->m<<endl;
  cout<<d->m<<endl;
  cout<<b.m<<endl;
  cout<<c.m<<endl;
  cout<<"--------------------"<<endl;
  C *a1, *d1;
  C b1;
  C c1{};   
  a1=new C();
  d1=new C;
  cout<<a1->m<<endl;
  cout<<d1->m<<endl;
  cout<<b1.m<<endl;
  cout<<c1.m<<endl;
 }

输出:

(Scenario 1)
    0 
    -1771317376
    -1771317376
    0
    --------------------
(Scenario 2)
    0
    0
    0
    0

试图解释这一点的帖子(但我不清楚为什么结果的差异以及导致m在每个场景中被初始化的原因):Default, value and zero initialization mess

1 个答案:

答案 0 :(得分:-1)

A没有用户定义的构造函数,因此生成了默认构造函数。 C具有用户定义的构造函数,因此无法保证生成默认构造函数,尤其是因为用户定义的构造函数会重载默认构造函数。几乎可以肯定的是,C的每个构造都使用了用户定义的构造函数。

C的用户定义构造函数中,使用初始化列表来初始化C::m。初始化C::m时,它是初始化值,包括零初始化。

new A;A b;是默认初始化。这不会设置为其成员分配任何值。 A::m中存储的值是未定义的行为。

new A();A c{};是值初始化。作为值初始化的一部分,它执行零初始化。