我主要对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的某个初始化(是哪个)。对这个有什么评论吗?
答案 0 :(得分:1)
aptr->a1
,aptr->a2
中每个字段的值是多少,aptr->a3
?
aptr->a1
将有5
:由于A(int a): a1(a){}
,您将通过A(5)
。aptr->a2
将是默认的(编译器)构造的B
对象(即聚合
类型),其垃圾值为b1
和b2
。aptr->a3
将是由您提供的默认构造函数(即C
)构造的C(){ c2 = 1234; }
对象。意味着c1
中的a3
将具有垃圾值,并且c2
将被1234
初始化。