C++中未设置布尔值的默认值?

Lem*_*ons 19 c++ boolean

可能重复:
为什么默认情况下C++ bool var为true?

说我要做这样的事情:

class blah
{
  public:
  bool exampleVar;
};

blah exampleArray[4];
exampleArray[1].exampleVar = true;
Run Code Online (Sandbox Code Playgroud)

在exampleArray中,现在有3个未设置的exampleVar实例,没有我设置它们的默认值是什么?

Pra*_*ian 45

默认值取决于exampleArray声明的范围.如果它是函数的本地值,则值将是随机的,无论这些堆栈位置恰好是什么值.如果它是静态的或在文件范围(全局)声明,则值将初始化为零.

这是一个演示.如果需要成员变量具有确定性值,请始终在构造函数中初始化它.

class blah
{
  public:
  blah() 
  : exampleVar(false)
  {}

  bool exampleVar;
};
Run Code Online (Sandbox Code Playgroud)

编辑:
使用C++ 11不再需要上例中的构造函数.数据成员可以在类声明本身中初始化.

class blah
{
  public:
  bool exampleVar = false;
};
Run Code Online (Sandbox Code Playgroud)

如果需要,可以由用户定义的构造函数覆盖此内联默认值.


Sal*_*iti 8

struct x
{
    bool b;

    x() : b() { }
}

...
x myx;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,myx.b将为false.

struct x
{
    bool b;
}

...
x myx;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,myx.b将是不可预测的,它将是分配myx之前内存位置的值.

由于在C和C++中,false值定义为0,而true值定义为非零,因此随机地址位置包含真值而不是false值的可能性更大.通常,在C++中,sizeof(bool)为1,表示8位.内存的随机位置是错误的,有超过255种可能性,这就解释了为什么你将默认的布尔值视为真.