首页 > 解决方案 > c++11默认初始化/值初始化/直接初始化

问题描述

我主要对 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->a1, aptr->a2, 中的每个字段的值是aptr->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 的某些初始化(它是哪一个)设置 Ai 对此有何评论?

标签: c++c++11constructorinitializationinitialization-list

解决方案


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

  • aptr->a1会有5:因为A(int a): a1(a){}和你擦肩而过A(5)
  • aptr->a2将是B具有其b1b2垃圾值的默认(编译器生成)构造对象(即聚合类型)。
  • aptr->a3将是C由您提供的默认构造函数构造的对象(即C(){ c2 = 1234; })。含义c1ina3将具有垃圾值,并且c2将使用1234.

推荐阅读