2017-07-24 125 views
4

为什么这两种方案(A和C的初始化)在C++ 14中产生不同的默认初始化结果? 基于在cppreference.com默认初始化规则我无法理解的结果C++默认初始化类型

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

+0

您能否提供您参考的cppreference.com页面? –

+0

你的命名是如此令人困惑 – bolov

+0

@JohnathanGross我已经更新了原帖,并附有引用cppreference – darkThoughts

回答

-1

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

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

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

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

+2

“C有一个用户定义的构造函数,所以不能保证默认的构造函数被生成”。实际上,可以保证默认的构造函数不会被隐式生成。 – bolov