C++ 为什么是C++;bool var默认为true?

C++ 为什么是C++;bool var默认为true?,c++,static,boolean,default,C++,Static,Boolean,Default,bool“bar”默认为true,但应为false,不能在构造函数中初始化。有没有一种方法可以将其初始化为false而不使其成为静态的 代码的简化版本: 福安 富科 事实上,默认情况下它根本没有初始化。您看到的值只是内存中用于分配的一些垃圾值 如果要设置默认值,必须在构造函数中请求: class Foo{ public: Foo() : bar() {} // default bool value == false // OR to be clear: Foo(

bool“bar”默认为true,但应为false,不能在构造函数中初始化。有没有一种方法可以将其初始化为false而不使其成为静态的

代码的简化版本:

福安

富科


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

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

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

     void foo();
private:
     bool bar;
}
更新C++11:

如果可以使用C++11编译器,现在可以使用默认构造(大多数情况下):


C/C++没有为你初始化变量。bar现在使用的内存位置中有一个值,该值被解释为“true”。情况并非总是如此。您必须在构造函数中初始化它。

此程序具有未定义的行为。内在类型没有构造函数。你可以做
boolbar=bool()但最好在foo类中定义实际值。

尝试以下方法:

class Foo
{ 
  public: 
    void Foo(); 
  private: 
     bool bar; 
} 

Foo::Foo() : bar(false)
{
  if(bar) 
  { 
    doSomething(); 
  }
}

您可以在声明任何变量时对其进行初始化

bool bar = 0;


克莱姆的回答恰到好处。要“解决”你的问题,你可以使用一个。我强烈建议您阅读该页面,因为它可能会清除您将来可能遇到的一些类似查询。

由于您在ctor中使用了bar的值,我假设您正在尝试在创建对象之前设置它?我想你是想让它成为一个静态类变量,而不是一个实例变量。

为什么不能在构造函数中初始化它?构造函数怎么会被多次调用?从代码中,看起来它可能是一个持久变量,用于控制对象的构造方式——在这种情况下,它需要是
静态的
。事实上,它根本没有初始化,所以它可能有两个值。我认为您需要告诉我们更多关于您真正试图实现的目标,以便任何人对此给出真正明智的建议。方法doSomethink()的名称肯定包含键入错误。您可能指的是doSomethinking(),methinks。因此,如果(bar)
为真,您几乎有100%的可能性
if(bar)
。某些编译器会将调试构建中的内存初始化为特定模式。如果使用这些编译器中的一个,调试生成将有100%的几率bar为真。@Adam:该语言不要求对
false
true
进行任何特定的物理表示,这意味着理论上一个实现可以使用,物理
1
表示
true
和所有其他物理模式表示
false
。在这样一个实现中,一个统一的
bool
对象总是
false
。你(其他评论者)在说什么?Klaim代码中的两个构造函数都是正确的。(我怀疑您不知道在第一个构造函数中进行了零初始化->参见n3000§8.5/5/7和/10)@UncleBens:是的,在标准的脚注中说,“以本国际标准描述为‘未定义’的方式使用布尔值,例如通过检查未初始化的自动变量的值,可能会导致其表现为既不正确也不错误“。像往常一样,未定义的行为意味着所有的赌注都被取消了…我认为是一样的,但我得到了一个C2864错误:只有静态常量整型数据成员可以在类内初始化。这对于局部变量是正确的,但对于类成员不是。
0
是一个整数文本
false
是一个布尔文字。哎呀,@Klaim比我先提供了一个例子。foo()是一个拼写错误,foo()应该是foo(),在OP更新了问题之后,foo()不再存在,所以我回复了,@Nick。不过谢谢,这要看情况而定。POD成员变量未初始化,但非POD成员得到默认构造。当然,全局/静态变量是初始化的。
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.
}
class Foo
{ 
  public: 
    void Foo(); 
  private: 
     bool bar; 
} 

Foo::Foo() : bar(false)
{
  if(bar) 
  { 
    doSomething(); 
  }
}
bool bar = 0;