为什么默认情况下C++ bool var为true?

Chr*_*erw 17 c++ static boolean default

bool"bar"默认为true,但它应该为false,它不能在构造函数中初始化.有没有办法将它初始化为假而不使其静态?

简化版代码:

foo.h中

class Foo{
 public:
     void Foo();
private:
     bool bar;
}
Run Code Online (Sandbox Code Playgroud)

foo.c的

Foo::Foo()
{  
   if(bar)
   {
     doSomethink();
   }
}
Run Code Online (Sandbox Code Playgroud)

Kla*_*aim 64

事实上,默认情况下它根本没有初始化.您看到的值只是内存中用于分配的一些垃圾值.

如果要设置默认值,则必须在构造函数中请求它:

class Foo{
 public:
     Foo() : bar() {} // default bool value == false 
     // OR to be clear:
     Foo() : bar( false ) {} 

     void foo();
private:
     bool bar;
}
Run Code Online (Sandbox Code Playgroud)

更新C++ 11:

如果你可以使用C++ 11编译器,你现在可以改为默认构造(大部分时间):

class Foo{
 public:
     // The constructor will be generated automatically, except if you need to write it yourself.
     void foo();
private:
     bool bar = false; // Always false by default at construction, except if you change it manually in a constructor's initializer list.
}
Run Code Online (Sandbox Code Playgroud)

  • 因此,你有几乎100%的机会'if(bar)`是真的. (8认同)
  • @Adam:该语言没有强制要求'false`和`true`的任何特定物理表示,这意味着理论上一个实现可以使用物理`1`表示`true`和所有其他物理模式表示`false` .在这样的实现中,一个单元化的`bool`对象将永远是'false`. (4认同)
  • 你(其他评论者)在谈论什么?来自Klaim代码的两个构造函数都是正确的.(我怀疑你不知道第一个构造函数中的零初始化 - >参见n3000§8.5/ 5/7和/ 10) (4认同)
  • @UncleBens:是的,在一个脚注标准中说,"以本国际标准描述的方式使用bool值为'未定义',例如通过检查未初始化的自动变量的值,可能会使其表现得好像是既不真实也不虚假".与往常一样,未定义的行为意味着所有赌注都已关闭...... (4认同)
  • 一些编译器会将调试版本中的内存初始化为特定模式.如果使用其中一个编译器,调试版本将有100%的可能性为真. (2认同)
  • IIRC Darwin 默认情况下将内存初始化为零,因此您也可能会出现跨平台行为不一致的情况。 (2认同)

Nic*_*ton 5

克莱姆的答案是正确的。要“解决”您的问题,可以使用构造函数初始化列表。我强烈建议您阅读该页面,因为它可能会清除您将来可能遇到的类似查询。