Значение по умолчанию для unset boolean в С++?
Возможный дубликат:
Почему по умолчанию используется параметр bool var true?
Скажем, я должен был сделать что-то вроде этого:
class blah
{
public:
bool exampleVar;
};
blah exampleArray[4];
exampleArray[1].exampleVar = true;
В exampleArray теперь есть 3 неустановленных экземпляра exampleVar, каковы их значения по умолчанию, если я не установлю их?
Ответы
Ответ 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 и установите значение по умолчанию.