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



我主要对 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),我们可以评论一下吗

  1. aptr->a1中每个字段的值是多少,aptr->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 设置人工智能的特定初始化(是哪一个(。对此有何评论?

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

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

相关内容

  • 没有找到相关文章

最新更新