2017-07-24 123 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