2012-06-25 39 views
-1

下面的代碼從不打印出計數器,假設編譯器做了一些智能的初始化int數據成員類型爲零的東西?GCC默認int數據成員初始化

include <iostream> 

using namespace std; 

class A { 
    public: 
    int a; 
    int b; 

    A(): b(a), a(b) { } 
}; 

int main() 
{ 
    A* p = new A; 
    int counter = 0; 

    while (!(p->a)) { 
     p = new A; 
     counter++; 
    } 

    cout << counter << endl; 
} 
+0

這是未定義的行爲。您正在使用未初始化的變量來初始化其他變量。我只是說你很幸運,把它們歸爲零。 –

回答

1

這是未定義的行爲。 a是第一個被初始化的,它被初始化爲b,這是一個未初始化的變量。如果你想要的值初始化(或0):

A(): b(), a() { } 

注意初始化的順序是成員出現在類定義,而不是在成員初始化列表中的順序。

3

下面的代碼永遠不會打印出櫃檯,假設編譯器 做了聰明,int數據成員類型初始化爲 爲零?

該假設是錯誤的。未初始化變量的值是不確定的。它可能是一些隨機數,恰好在記憶中。

更改構造線這樣的:

A(): b(0), a(0) { } 

這明確地初始化值爲零,也明確傳達意圖。請記住,代碼在那裏供人類閱讀。電腦從來沒有真正看到你的C++代碼。

另外請注意,以下是等價的:

A(): b(), a() { } 

雖然我沒有親自使用初始化此方法。


初始化不是代碼的唯一問題。首先,你在代碼中有大量的內存泄漏,因爲你沒有deleteAnew編輯的實例。 Go pick up a good introductory C++ book並學習適當的現代C++,因爲你的文章表明你不太理解語言基礎。

+0

*迂迴* - 括號內的'0'是多餘的。 –

+0

此外,它不是必須未定義的值,而是整個程序的行爲。 –

+0

@LuchianGrigore:自鑽研迂腐:未初始化變量的值是* Indeterminate *和* not Undefined *。 –