Почему С++ bool var true по умолчанию?
bool "bar" по умолчанию true, но он должен быть ложным, он не может быть инициализирован в конструкторе. есть способ инициализировать его как false, не делая его статическим?
Упрощенная версия кода:
foo.h
class Foo{
public:
void Foo();
private:
bool bar;
}
foo.c
Foo::Foo()
{
if(bar)
{
doSomethink();
}
}
Ответы
Ответ 1
Фактически, по умолчанию он не инициализируется вообще. Значение, которое вы видите, - это просто некоторые значения корзины в памяти, которые были использованы для выделения.
Если вы хотите установить значение по умолчанию, вам нужно запросить его в конструкторе:
class Foo{
public:
Foo() : bar() {} // default bool value == false
// OR to be clear:
Foo() : bar( false ) {}
void foo();
private:
bool bar;
}
UPDATE С++ 11:
Если вы можете использовать компилятор С++ 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 initializer list.
}
Ответ 2
Ответ на призыв - это место. Чтобы "решить" вашу проблему, вы можете использовать список инициализации конструктора. Я настоятельно рекомендую вам прочитать эту страницу, так как она может прояснить некоторые похожие запросы, которые могут возникнуть в будущем.
Ответ 3
C/С++ не инициализируют переменные для вас вообще. Место памяти, которое теперь используется баром, имеет значение в нем, которое интерпретируется как "истина". Это не всегда так. Вы должны инициализировать его в своем конструкторе.
Ответ 4
Эта программа имеет поведение undefined. Внутренние типы не имеют конструкторов. Вы можете сделать bool bar = bool();
, но лучше определить фактическое значение в вашем классе foo.
Ответ 5
Попробуйте следующее:
class Foo
{
public:
void Foo();
private:
bool bar;
}
Foo::Foo() : bar(false)
{
if(bar)
{
doSomething();
}
}
Ответ 6
Поскольку вы используете значение bar в ctor, я предполагаю, что вы пытаетесь установить его до создания объекта? Я думаю, вы хотели сделать это статической переменной класса вместо переменной экземпляра.
Ответ 7
Вы можете инициализировать любую переменную при ее объявлении.
bool bar = 0;