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

我对通过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),我们可以评论一下吗
  • aptr->a1aptr->a2aptr->a3
  • 在此过程中触发了什么初始化?


  • 补充:
    混淆的一部分来自于
    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)。对此有何评论?

    最佳答案


  • aptr->a1将具有5:由于A(int a): a1(a){},因此您传递A(5)
  • aptr->a2将是默认的(编译器)构造的B对象(即聚合
    类型)的b1b2垃圾值。
  • aptr->a3将是由您提供的默认构造函数(即C)构造的C(){ c2 = 1234; }对象。表示c1中的a3将具有垃圾值,并且c2将使用1234初始化。
  • 关于c++ - c++ 11默认初始化/值初始化/直接初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58331484/

    10-11 22:33
    查看更多