Почему C ++ bool var true по умолчанию? - PullRequest
16 голосов
/ 11 января 2010

bool "bar" по умолчанию true, но должно быть false, его нельзя инициализировать в конструкторе. Есть ли способ инициализировать это как ложное, не делая его статичным?

Упрощенная версия кода:

foo.h

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

foo.c

Foo::Foo()
{  
   if(bar)
   {
     doSomethink();
   }
}

Ответы [ 7 ]

63 голосов
/ 11 января 2010

Фактически, по умолчанию он вообще не инициализируется. Значение, которое вы видите, представляет собой просто некоторые значения мусора в памяти, которые использовались для выделения.

Если вы хотите установитьзначение по умолчанию, вам нужно будет запросить его в конструкторе:

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, вы можетевместо этого используется конструкция по умолчанию (большую часть времени):

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.
}
4 голосов
/ 11 января 2010

Ответ Клаима точный.Чтобы «решить» вашу проблему, вы можете использовать список инициализации конструктора .Я настоятельно рекомендую вам прочитать эту страницу, так как она может очистить некоторые похожие запросы, которые могут у вас возникнуть в будущем.

1 голос
/ 11 января 2010

Эта программа имеет неопределенное поведение. Внутренние типы не имеют конструкторов. Вы можете сделать bool bar = bool();, но лучше определить фактическое значение в вашем классе foo.

1 голос
/ 11 января 2010

C / C ++ вообще не инициализирует переменные для вас. В ячейке памяти, которая теперь используется bar, есть значение, которое интерпретируется как «true». Это не всегда будет так. Вы должны инициализировать его в своем конструкторе.

0 голосов
/ 11 января 2010

Поскольку вы используете значение bar в ctor, я полагаю, вы пытаетесь установить его до создания объекта? Я думаю, что вы хотели сделать его статической переменной класса вместо переменной экземпляра.

0 голосов
/ 11 января 2010

Вы можете инициализировать любую переменную при ее объявлении.

bool bar = 0;
0 голосов
/ 11 января 2010

Попробуйте это:

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

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