【问题标题】:C++ default initialization types [duplicate]C ++默认初始化类型[重复]
【发布时间】:2017-12-30 14:27:05
【问题描述】:

为什么这两种情况( A 和 C 的初始化)在 C++ 14 中会产生不同的默认初始化结果? 根据 cppreference.com 中的默认初始化规则,我无法理解结果

struct A { int m; };
struct C { C() : m(){};  int m; };  

int main() {
  A *a, *d;
  A b;
  A c{};
  a=new A();
  d=new A;
  cout<<a->m<<endl;
  cout<<d->m<<endl;
  cout<<b.m<<endl;
  cout<<c.m<<endl;
  cout<<"--------------------"<<endl;
  C *a1, *d1;
  C b1;
  C c1{};   
  a1=new C();
  d1=new C;
  cout<<a1->m<<endl;
  cout<<d1->m<<endl;
  cout<<b1.m<<endl;
  cout<<c1.m<<endl;
 }

输出:

(Scenario 1)
    0 
    -1771317376
    -1771317376
    0
    --------------------
(Scenario 2)
    0
    0
    0
    0

试图解释这一点的帖子(但我还不清楚为什么结果的差异以及导致 m 在每种情况下被初始化的原因):Default, value and zero initialization mess

【问题讨论】:

  • 您能否提供您所引用的 cppreference.com 页面?
  • 你的命名太混乱了
  • @JohnathanGross 我已经更新了原始帖子,其中包含一个帖子链接,该帖子引用了 cppreference 中的相关部分
  • a 和 c 是值初始化的示例(将所有内容归零)。 b 和 d 是默认初始化的示例,对于诸如 A 之类的普通可构造类型没有任何作用

标签: c++ initialization c++14 default-value


【解决方案1】:

A 没有用户定义的构造函数,因此生成了默认构造函数。 C 有一个用户定义的构造函数,因此不能保证生成了默认构造函数,尤其是因为用户定义的构造函数重载了默认构造函数。几乎可以肯定,C 的每个构造都使用了用户定义的构造函数。

C 的用户定义构造函数中,使用初始化列表来初始化C::mC::m在初始化的时候,就是值初始化,包括零初始化。

new A;A b; 是默认初始化。这不会设置为它们的成员分配任何值。 A::m 中存储的值是未定义的行为。

new A();A c{}; 是值初始化。作为值初始化的一部分,它执行零初始化。

【讨论】:

  • “C 有一个用户定义的构造函数,因此不能保证生成了默认构造函数”。实际上有保证不会隐式生成默认构造函数。
猜你喜欢
  • 2012-09-15
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 2016-04-26
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多