0

有人能解釋我這個代碼是怎麼回事。Visual Studio 2013 C++類屬性初始化問題

class Point 
{ 
private: 

    int x; 
    int y; 

public: 
    Point(){} 
    void print(){ 
     cout << x << " " << y << endl; 
    } 
}; 

int main() 
{ 
    Point p; 
    p.print(); 

    return 0; 
} 

如果我運行此代碼輸出是-858993460 -858993460女巫是正常的我。這是垃圾,因爲我沒有初始化我的2個屬性。

下面是奇怪的事情......

class Point 
{ 
private: 

    int x; 
    int y; 
    int* buf; 
public: 
    Point(){} 
    void print(){ 
     cout << x << " " << y << " " << buf << endl; 
    } 
}; 

int main() 
{ 
    Point p; 
    p.print(); 

    return 0; 
} 

現在,我把INT * BUF作爲一類新的成員,當我運行此代碼,我的所有屬性都初始化爲零。輸出是0 0 00000000.我使用visual studio 2013,我不認爲這種行爲發生在Visual Studio 2010中。

有人可以解釋背後的邏輯嗎?

回答

1

你的類成員從未初始化爲零,你需要的,如果他們是零在你的第二個例子自己做在你的構造

class Point 
{ 
private: 

    int x; 
    int y; 

public: 
    Point():x(0), y(0) {} 
    void print(){ 
     cout << x << " " << y << endl; 
    } 
}; 

,那麼它是純粹的巧合

+0

的問題是HTTP的副本:/ /stackoverflow.com/questions/3127454/how-do-c-class-members-get-initialized-if-i-dont-do-it-explyly – 2014-10-10 14:14:50

+0

我知道構造函數在那裏初始化類成員。我不認爲這是巧合。我很確定這個奇怪的行爲有一個解釋。 – Joel 2014-10-10 16:09:16

+0

C++規範聲明它們將保持不確定的值。所以無論如何,這是不好的編程風格不適當初始化。 – 2014-10-11 09:02:28

0

當你打印這些intint*您正在打印分配之前存儲在內存中的垃圾數據。請注意,您正在打印buf所保存的地址,而不是指向它的值。打印*buf可能會給你一個段錯誤。

-858993460二進制是:11001100110011001100110011001100

這可能是因爲這是在Visual Studio 2010的默認存儲位置的調試器,以提醒你,你正在閱讀的壞數據。

至於2010和2013之間的差異,它可能是你不再在調試運行,或在2013年您的默認調試塊寫入只是0