2010-04-11 146 views
2

第一個打印顯示成員值爲false,另外兩個打印顯示爲true。爲什麼第一個輸出與最後兩個輸出不同?C++類構造和成員初始化

#include <vector> 
#include <iostream> 

using namespace std; 

class MyClass 
{ 
public: 
    bool value; 
    bool stuff; 
}; 

class Container 
{ 
public: 
    vector<MyClass> my_classes; 
    Container() 
    { 
    MyClass c; 
    cout << c.value << endl; 
    my_classes.push_back(c); 
    } 
}; 

int main (int argc , char* argv[]) 
{ 
    MyClass mc; 
    cout << mc.value << endl; 
    Container con; 
    cout << con.my_classes[0].value << endl; 
    return 0; 
} 
+1

似乎有一個解析器錯誤,'<…>'中的所有內容都丟失了,包括'cout'後面的所有內容。 – Philipp 2010-04-11 21:01:45

+1

請勿嘗試使用HTML標籤格式化您的代碼 - 使用文本輸入區域上方的1010按鈕。 – 2010-04-11 21:03:59

+0

@ Philipp第一次時間碼格式化發帖痛苦,抱歉。 – anachoret 2010-04-11 21:04:15

回答

8

這兩個成員是原始(非類)對象,因此未初始化。這意味着它們的值在運行時將是任意的。您必須在構造函數中初始化它們:

class MyClass { 
public: 
    bool value; 
    bool stuff; 
    MyClass(): value(false), stuff(false) { } 
}; 
+0

類與結構不會影響這個。構造函數是重要的事情。 – Potatoswatter 2010-04-11 21:07:15

+0

爲什麼第一次打印始終是假(或特定整數),而後兩次打印具有相同的值,與第一次打印不同?愚蠢的運氣?編譯器的差異?輸出值也似乎根據MyClass成員的數量而有所不同。 – anachoret 2010-04-11 21:08:19

+0

@anachoret:愚蠢的運氣。 – Potatoswatter 2010-04-11 21:08:47

3

您沒有初始化成員爲任何值。他們只會擁有任何曾經在那個地方的價值。

+0

爲什麼MyClass的第一個構建和容器的後續打印始終將bools初始化爲false? – anachoret 2010-04-11 21:10:29

+2

它沒有。它只是發生它使用的內存塊始終包含該值。如果您重新安排程序或添加它,它可能會改變 – jcoder 2010-04-11 21:13:49

1

您在main(..)中聲明的對象是自動的,因此會分配到正在運行的線程的堆棧中。由於您不初始化對象,它們只是填充了以前在這個堆棧中的部分數據。

如果您的處理器是Intel x86架構的,對於一個典型的功能會是這個樣子(AT & T語法)

pushl %ebp 
movl %esp, %ebp 
subl $LOCAL_VARIABLES_NUM * WORD_SIZE, %esp 

... 
<function code goes here> 
<that is how we read variable values> 
movl -4(%ebp), %ebx   
... 

addl $LOCAL_VARIABLES_NUM * WORD_SIZE, %esp 
popl %ebp 

彙編語言代碼,如你所見,我們簡單地加減法,必要來自堆棧指針的字節數,將舊數據保留在原來的位置。