【发布时间】:2020-02-08 09:42:56
【问题描述】:
我主要对 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->a1、aptr->a2中每个字段的值是多少,aptr->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.对此有何评论?
【问题讨论】:
-
对我来说,我总是定义初始化所有成员的构造函数,然后您就不必担心编译器可能会或可能不会做什么。
-
谢谢 - 我明白了。但最好了解实际规则。
标签: c++11 c++ c++11 constructor initialization initialization-list