c++ - 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)
,我们可以评论吗?
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 的某些初始化(它是哪一个)设置 Ai 对此有何评论?
解决方案
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
ina3
将具有垃圾值,并且c2
将使用1234
.
推荐阅读
- reporting-services - 如何在 SSRS 2017 中隐藏帮助菜单
- javascript - 单击按钮后使用 jscolor.js
- java - 有什么方法可以从 JEditorPane 上显示的网站获取响应?
- model - UPPAAL SMC 激励示例
- azure - 在逻辑应用中限制 APIM IP 时无法通过 APIM 访问逻辑应用
- javascript - 与 >> 运算符的简单 for 循环之间的区别
- amazon-cognito - Auth0 作为前端登录 Cognito 用户
- c# - EntityFrameworkCore PostgreSQL Left Join with where not working
- rest - 如何测试服务器 API (REST),包括来自多个用户/客户端与 symfony 的交互?
- elasticsearch - 如何搜索不在特定地理区域内的文档?