说我要做这样的事情:
class blah
{
public:
bool exampleVar;
};
blah exampleArray[4];
exampleArray[1].exampleVar = true;
在exampleArray中,现在有3个未设置的exampleVar实例,没有我设置它们的默认值是什么?
答案 0 :(得分:45)
默认值取决于声明exampleArray
的范围。如果它是函数的本地值,则值将是随机的,无论这些堆栈位置恰好是什么值。如果它是静态的或在文件范围(全局)声明,则值将初始化为零。
Here's示威游行。如果您需要成员变量具有确定性值,请始终在构造函数中初始化它。
class blah
{
public:
blah()
: exampleVar(false)
{}
bool exampleVar;
};
修改强>
C ++ 11不再需要上例中的构造函数。数据成员可以在类声明本身中初始化。
class blah
{
public:
bool exampleVar = false;
};
如果需要,可以由用户定义的构造函数覆盖此内联默认值。
答案 1 :(得分:8)
struct x
{
bool b;
x() : b() { }
}
...
x myx;
在这种情况下,myx.b将为false。
struct x
{
bool b;
}
...
x myx;
在这种情况下,myx.b将是不可预测的,它将是分配myx之前内存位置的值。
因为在C和C ++中,假值被定义为0并且真值被定义为非零,所以随机地址位置包含真值而不是伪值的可能性更大。通常,在C ++中,sizeof(bool)为1,表示8位。有超过255种可能性,内存的随机位置是错误的,这就解释了为什么你认为默认的布尔值为真。
答案 2 :(得分:3)
他们的默认值是未定义的。你不应该依赖它们被设置为一个或另一个,并且通常被称为“垃圾”。
根据您的编译器,它可能设置为false
。但即便如此,你最好还是设置它们。
答案 3 :(得分:2)
默认值为 indeterminate 。每次运行程序时可能都不同。您应该将值初始化为某个值,或者使用另一个变量来指示您的私有成员未初始化。
答案 4 :(得分:2)
不确定
非静态成员变量需要初始化,除非您可以保证对它们执行的第一个操作是写入。最常见的方式是通过构造函数。如果您仍然需要no-arg / no-op构造函数,请使用初始化列表:
public:
blah() : exampleVar(false) {}
答案 5 :(得分:2)
@Praetorian:在答案中涵盖了要点。
但值得注意的是。
blah exampleArray[4]; // static storage duration will be zero-initialized
// ie POD member exampleVar will be false.
void foo()
{
blah exampleArray1[4]; // automatic storage duration will be untouched.
// Though this is a class type it only has a compiler
// generated constructor. When it is called this way
// it performs default-construction and POD members
// have indeterminate values
blah exampleArray2[4] = {}; // Can force zero-in initialization;
// This is list-initialization.
// This forces value-initialization of each member.
// If this is a class with a compiler generated constrcutor
// Then each member is zero-initialized
// following through to non array types.
blah tmp1; // Default initialized: Member is indeterminate
blah tmp2 = blah(); // Zero Initialized: Members is false
// Unfortunately does not work as expected
blah tmp3(); // Most beginners think this is zero initialization.
// Unfortunately it is a forward function declaration.
// You must use tmp2 version to get the zero-initialization
}
答案 6 :(得分:1)
未分配的默认值在C / C ++中未定义。如果需要特定值,则为类blah创建构造函数并设置默认值。