【问题标题】:c++11 default initialization / value initialization / direct initializationc++11默认初始化/值初始化/直接初始化
【发布时间】:2020-02-08 09:42:56
【问题描述】:

我主要对 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.对此有何评论?

【问题讨论】:

  • 对我来说,我总是定义初始化所有成员的构造函数,然后您就不必担心编译器可能会或可能不会做什么。
  • 谢谢 - 我明白了。但最好了解实际规则。

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


【解决方案1】:

aptr-&gt;a1aptr-&gt;a2 中每个字段的值是多少, aptr-&gt;a3?

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

【讨论】:

  • 谢谢,问题补充部分的代码示例能解释一下吗?
  • @LiangLuo 这本身就让我感到困惑,这就是为什么我没有在回答中考虑。 ;) 另一方面,如果您使用c++11 或后者,则后一种情况在给定的 cmets 中似乎很重要。如果您想对代码示例进行具体推理,我建议您提出一个仅关注它的不同问题。
猜你喜欢
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
相关资源
最近更新 更多