c ++ 11默认初始化/值初始化/直接初始化

时间:2019-10-10 21:43:38

标签: c++ c++11 constructor initialization initialization-list

我主要对c ++中不同的初始化概念感到困惑,尤其是在标准中。

我对通过new(无论是否相关)构造对象,并提供了一个初始化程序列表(与用户定义的构造函数匹配)的情况感到困惑,该构造函数不进行初始化所有成员(包括POD和其他类)。

以下内容证明了我的困惑。

class B
{
public:
    int b1;
    int b2;
};

class C
{
public:
    int c1;
    int c2;
    C()
    {
        c2 = 1234;
    }
};

class A
{
public:
    int a1;
    B a2;
    C a3;
    A(int a): a1(a){}
};

现在,如果我写auto aptr = new A(5),我们可以发表评论吗

  1. aptr->a1aptr->a2aptr->a3

  2. 在此过程中触发了什么初始化?


补充: 混淆的一部分来自于 https://en.cppreference.com/w/cpp/language/zero_initialization

struct A
{
    int i;
    A() { } // user-provided default ctor, does not initialize i
};

struct B { A a; }; // implicitly-defined default ctor

std::cout << B().a.i << '\n'; // value-initializes a B temporary
                              // leaves b.a.i uninitialized in C++03
                              // sets b.a.i to zero in C++11
// (note that B{}.a.i leaves b.a.i uninitialized in C++11, but for 
// a different reason: in post-DR1301 C++11, B{} is aggregate-initialization,
// which then value-initializes A, which has a user-provided ctor)

B的值初始化似乎会触发A设置A.i的某个初始化(是哪个)。对这个有什么评论吗?

1 个答案:

答案 0 :(得分:1)

  

aptr->a1aptr->a2中每个字段的值是多少,       aptr->a3

  • aptr->a1将有5:由于A(int a): a1(a){},您将通过A(5)
  • aptr->a2将是默认的(编译器)构造的B对象(即聚合 类型),其垃圾值为b1b2
  • aptr->a3将是由您提供的默认构造函数(即C)构造的C(){ c2 = 1234; }对象。意味着c1中的a3将具有垃圾值,并且c2将被1234初始化。