首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++11默认初始化/值初始化/直接初始化

c++11默认初始化/值初始化/直接初始化
EN

Stack Overflow用户
提问于 2019-10-10 21:43:38
回答 1查看 101关注 0票数 2

我主要对c++中不同初始化的概念感到困惑,特别是在c++11标准中。

我特别感到困惑的是,对象是通过new (相关与否)构造的,并且提供了一个初始化器列表(与用户定义的构造函数匹配),并且构造函数没有初始化所有成员(包括POD和其他类)。

以下是我的困惑。

代码语言:javascript
复制
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->a2aptr->a3中每个字段的值是多少?
  2. 在此过程中触发什么初始化?

补充:部分混淆来自于初始化中包含的示例

代码语言:javascript
复制
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.i的A的某些初始化(哪一个是它)。对这个有什么意见吗?

EN

回答 1

Stack Overflow用户

发布于 2019-10-11 06:58:48

aptr->a1aptr->a2aptr->a3中每个字段的值是多少?

  • aptr->a1将拥有5:因为A(int a): a1(a){},而您通过了A(5)
  • aptr->a2将是一个默认的(编译器语法化)构造的B对象(即聚合类型),具有它的b1b2垃圾值。
  • aptr->a3将是由您提供的默认构造函数(即C(){ c2 = 1234; })构造的C对象。这意味着c1a3中将具有垃圾值,而c2将被1234弱化。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58331484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档