2010-04-11 3 views
2

Первая печать показывает значение члена как ложное, а две другие - как истинные. Почему первый результат отличается от двух последних?Конструкция класса 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

+1

Пожалуйста, не пытайтесь форматировать свой код с помощью HTML-тегов - используйте кнопку 1010 над областью ввода текста. – 2010-04-11 21:03:59

+0

@ Филипп Первый раз форматирование сообщений болей, извините. – anachoret

ответ

8

Эти два элемента являются примитивными (неклассовыми) объектами и, следовательно, неинициализированы. Это означает, что их значения будут произвольными во время выполнения. Вы должны инициализировать их в конструкторе:

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

Класс vs struct не влияет на это. Конструктор - это важная вещь. – Potatoswatter

+0

Почему первый печатный текст является последовательно ложным (или конкретным целым числом), в то время как два вторых отпечатка имеют одно и то же значение, отличное от первого? Удача? Различия компилятора? Выходные значения также, по-видимому, различаются в зависимости от количества членов MyClass. – anachoret

+0

@anachoret: немой удача. – Potatoswatter

3

Вы не инициализируете участников каким-либо значением. Раньше у них была какая-то ценность, которая была в этом месте памяти.

+0

Почему первая конструкция MyClass и последующая печать внутри Container всегда инициализируют bools на false? – anachoret

+2

это не так. просто случается, что кусочек памяти, который он использует, всегда содержит это значение. Если вы измените свою программу или добавите к ней ее вероятность, что она изменится – jcoder

1

Объекты, которые вы объявляете в основном (..), автоматически выделяются в стеке бегущей нити. Поскольку вы не инициализируете объекты, они просто заполняются данными, которые были ранее в этой самой части стека.

Если процессор имеет 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 

Как вы видите, мы просто добавить и необходимо вычитать количество байтов указателя стека, оставив старые данные там, где они были.

Смежные вопросы