C++ 默认初始化类型

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

<分区>

为什么这两种情况( 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

最佳答案

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

C 的用户定义构造函数中,使用初始化列表对 C::m 进行值初始化。当 C::m 被初始化时,它是值初始化的,其中包括零初始化。

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

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

关于C++ 默认初始化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45290121/

相关文章:

c++ - 数字 3、5 和 7 未显示为质数

c++ - 为什么这段代码用 g++ 而不是 MSVC++ 编译?

c - 尝试使用 const 初始化变量时出现错误 "initializer element is not constant"

c++ - 使用 union 作为树中的项目类型以存储两种不同的数据类型

c++ - C++ 中的 Monad 接口(interface)

c++ - 在编译时将 std::map 的选定元素初始化为相同的值

C++ 通过引用返回本地对象

c++ - 输出带有数字分组的数字(1000000 为 1,000,000 等等)

c++ - 如何通过 C++ 中构造函数的初始化列表来初始化类的私有(private)结构成员?

c# - 来自静态单例内联初始化的 NullReferenceException