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

Какие примитивные типы инициализируются по умолчанию на С++?

Когда я использую список инициализации:

struct Struct {
    Struct() : memberVariable() {}
    int memberVariable;
};

переменная-примитив типа (int, bool, float, enum, указатель) инициализируется по умолчанию. Является ли значение, которое получает реализация, или оно одинаково для всех реализаций?

4b9b3361

Ответ 1

Вы не правы. Объект не инициализируется по умолчанию, а инициализируется значением. И его значение четко определено

int = 0, 
bool = false, 
float = 0.0f,  
enum = (enum type)0, 
pointer = null pointer
pointer to member = null member pointer

Обратите внимание, что ноль находится в диапазоне значений для любого перечисления, даже если он не содержит явного перечислителя с этим vaue, поэтому безопасно инициализировать переменную перечисления до этого значения.

В частности, для указателя на элементы данных представление, используемое на практике, не является битами, отличным от нуля. В так называемом С++ Itanium ABI, используемом, по меньшей мере, GCC и Clang, указатель на члены данных имеет однозначное представление с единичными битами.

Ответ 2

В стандарте говорится (8.5/5)

Для инициализации объекта типа T по умолчанию:

- если T - тип класса не-POD (раздел 9), вызывается конструктор по умолчанию для T (и инициализация плохо сформирована, если Thas нет доступного конструктора по умолчанию);

- если T - тип массива, каждый элемент инициализируется по умолчанию;

- в противном случае объект инициализируется нулем.

.

Для инициализации объекта типа типа T означает:

- если T - тип класса (раздел 9) с объявленным пользователем конструктором (12.1), тогда вызывается конструктор по умолчанию для T (и инициализация плохо сформирована, если T не имеет доступного конструктора по умолчанию);

- если T - тип неединичного класса без конструктора, объявленного пользователем, то каждый нестатический элемент данных и компонент базового класса T инициализируются значением;

- если T - тип массива, то каждый элемент инициализируется значением;

- в противном случае объект инициализируется нулем

.

Является ли значение, которое получает реализация, или оно одинаково для всех реализаций?

Таким образом, значение будет одинаковым для всех реализаций.

Struct является не-POD-типом, поэтому

 Struct *a =new Struct; // default initialization

 //memberVariable will be initialized to 0 because if T is a non-POD class type
 //the default constructor for T is called 

 Struct *b = new Struct(); //value initializes Struct, which calls the default ctor.

 //memberVariable will be initialized to 0 in this case also.

ИЗМЕНИТЬ:

Поскольку @Johannes заметил, что переменная-член примитивного типа (int, bool, float, enum, pointer) имеет значение value-initialized not default initialized.

Ответ 3

Для примитивных типов инициализация по умолчанию означает, что объект инициализируется с помощью 0, 0.0 или NULL, если это подходит для типа.

Изменить: Вышеупомянутое действительно для С++ 98. В С++ 03 термины немного переопределены. Теперь использование инициализатора () (который является синтаксически возможным только для объектов-членов) приводит к инициализации значения, которое для примитивных типов означает, что сохраняется соответствующее значение 0, 0.0 или NULL.

Ответ 4

0

Если вы вызываете () в примитиве, эффект будет таким же, как присвоение значения по умолчанию, которое оно было бы дано, если оно было статичным.

Ответ 5

Это зависит от того, как вы создаете экземпляр класса, если вы используете ClassName(), классы POD по умолчанию инициализируются нулем для нестандартного конструктора класса POD, но если вы используете ClassName, без круглых скобок не происходит инициализация по умолчанию.

Ответ 6

Нативные типы, такие как int, обычно получают garbage value, например. независимо от того, что происходит в области памяти, в которой оно создано. Однако это не определено в стандарте, и оно также может быть инициализировано равным 0, что довольно часто встречается, например. отладочные сборки.

ИЗМЕНИТЬ. Но в принципе, вы никогда не должны доверять неинициализированной переменной, чтобы держать что-то конкретное; Всегда определяйте значения самостоятельно.