C++类构造和成员初始化
第一个打印显示成员值为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;
}
这两个成员是原始(非类)对象,因此未初始化。这意味着它们的值在运行时将是任意的。您必须在构造函数中初始化它们:
class MyClass {
public:
bool value;
bool stuff;
MyClass(): value(false), stuff(false) { }
};
类与结构不会影响这个。构造函数是重要的事情。 – Potatoswatter 2010-04-11 21:07:15
为什么第一次打印始终是假(或特定整数),而后两次打印具有相同的值,与第一次打印不同?愚蠢的运气?编译器的差异?输出值也似乎根据MyClass成员的数量而有所不同。 – anachoret 2010-04-11 21:08:19
@anachoret:愚蠢的运气。 – Potatoswatter 2010-04-11 21:08:47
您在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
汇编语言代码,如你所见,我们简单地加减法,必要来自堆栈指针的字节数,将旧数据保留在原来的位置。
似乎有一个解析器错误,''中的所有内容都丢失了,包括'cout'后面的所有内容。 – Philipp 2010-04-11 21:01:45
请勿尝试使用HTML标签格式化您的代码 - 使用文本输入区域上方的1010按钮。 – 2010-04-11 21:03:59
@ Philipp第一次时间码格式化发帖痛苦,抱歉。 – anachoret 2010-04-11 21:04:15