Подтвердить что ты не робот

Значение по умолчанию для unset boolean в С++?

Возможный дубликат:
Почему по умолчанию используется параметр bool var true?

Скажем, я должен был сделать что-то вроде этого:

class blah
{
  public:
  bool exampleVar;
};

blah exampleArray[4];
exampleArray[1].exampleVar = true;

В exampleArray теперь есть 3 неустановленных экземпляра exampleVar, каковы их значения по умолчанию, если я не установлю их?

4b9b3361

Ответ 1

Значение по умолчанию зависит от области, в которой объявлен exampleArray. Если он является локальным для функции, значения будут случайными, какими бы значениями они не располагались. Если он статичен или объявлен в области файлов (глобально), значения будут инициализированы нулем.

Вот демонстрация. Если вам нужна переменная-член для определения детерминированного значения, всегда инициализируйте ее в конструкторе.

class blah
{
  public:
  blah() 
  : exampleVar(false)
  {}

  bool exampleVar;
};

EDIT:
Конструктор в приведенном выше примере больше не нужен с С++ 11. Элементы данных могут быть инициализированы в самом объявлении класса.

class blah
{
  public:
  bool exampleVar = false;
};

Это встроенное значение по умолчанию может быть переопределено конструктором, заданным пользователем.

Ответ 2

struct x
{
    bool b;

    x() : b() { }
}

...
x myx;

в этом случае myx.b будет false.

struct x
{
    bool b;
}

...
x myx;

в этом случае myx.b будет непредсказуемым, это будет то значение, которое имеет место в памяти перед распределением myx.

Так как в C и С++ ложное значение определяется как 0, а истинное значение определяется как ноль, существует большая вероятность того, что случайное расположение адреса будет содержать истинное значение вместо ложного значения. Обычно в С++ sizeof (bool) равен 1, это означает, что 8 бит. Есть 1 более 255 возможностей, что случайное расположение памяти ложно, и это объясняет, почему вы считали значение логического значения по умолчанию истинным.

Ответ 3

Значения по умолчанию undefined. Вы не должны зависеть от того, что они установлены как то или иное и часто называются "мусором".

В зависимости от вашего компилятора он может быть установлен на false. Но даже тогда вам лучше их настроить.

Ответ 4

Значение по умолчанию является неопределенным. Возможно каждый раз, когда вы запускаете свою программу. Вы должны инициализировать значение чем-то или иметь другую переменную, указывающую, что ваши частные члены не инициализируются.

Ответ 5

Неопределенное.

Нестатические переменные-члены должны быть инициализированы, если вы не можете гарантировать, что первая операция, выполняемая над ними, будет записана. Самый распространенный способ - через конструктор. Используйте список инициализации, если вы все еще хотите конструктор no-arg/no-op:

public:
blah() : exampleVar(false) {}

Ответ 6

@Praetorian: Покрыл основные моменты в своем ответе.

Но также стоит отметить.

blah exampleArray[4];         // static storage duration will be zero-initialized 
                              // ie POD member exampleVar will be false.

void foo()
{
    blah exampleArray1[4];    // automatic storage duration will be untouched.
                              // Though this is a class type it only has a compiler 
                              // generated constructor. When it is called this way 
                              // it performs default-construction and POD members
                              // have indeterminate values


    blah exampleArray2[4] = {};  // Can force zero-in initialization;
                                 // This is list-initialization.
                                 // This forces value-initialization of each member.
                                 // If this is a class with a compiler generated constrcutor
                                 // Then each member is zero-initialized


    // following through to non array types.
    blah       tmp1;            // Default initialized: Member is indeterminate
    blah       tmp2 = blah();   // Zero Initialized: Members is false

    // Unfortunately does not work as expected
    blah       tmp3();          // Most beginners think this is zero initialization.
                                // Unfortunately it is a forward function declaration.
                                // You must use tmp2 version to get the zero-initialization 
}

Ответ 7

Неназначенные значения по умолчанию undefined в C/С++. Если вам нужно определенное значение, создайте конструктор для класса blah и установите значение по умолчанию.