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

标签 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->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 的某些初始化(它是哪一个)来设置 A.i。对此有何评论?

最佳答案

What will be the value of each fields in aptr->a1, aptr->a2, aptr->a3?

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

关于c++11 默认初始化/值初始化/直接初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58331484/

相关文章:

c++ - 在另一个类构造函数中初始化类对象

c++11 - std::bind 没有可行的转换

c++11 使用 std::thread 时意外的多态性行为

c++ - 继承的构造函数 - 定义可移植的固定大小类型 (C++)

c++ - 在 C++ 中什么时候需要或需要 "explicit specialization"?

c++ - 在 C++ 中对 int 使用按位与

c++ - STL Map 或 HashMaps 线程安全吗?

c++ - 带有两个参数包的模糊函数调用

c++ - 基类构造函数的段错误

C++ 模板 : The static member in a global object is not initialized