C++ 为什么是C++;bool var默认为true?
bool“bar”默认为true,但应为false,不能在构造函数中初始化。有没有一种方法可以将其初始化为false而不使其成为静态的 代码的简化版本: 福安 富科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(
事实上,默认情况下它根本没有初始化。您看到的值只是内存中用于分配的一些垃圾值 如果要设置默认值,必须在构造函数中请求:
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;