2010-04-11 145 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 

汇编语言代码,如你所见,我们简单地加减法,必要来自堆栈指针的字节数,将旧数据保留在原来的位置。