Какие примитивные типы инициализируются по умолчанию в C ++? - PullRequest
33 голосов
/ 27 сентября 2010

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

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

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

Ответы [ 6 ]

35 голосов
/ 27 сентября 2010

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

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

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

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

29 голосов
/ 27 сентября 2010

Стандарт гласит (8.5/5)

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

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

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

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

.

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

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

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

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

- другоеrwise, объект инициализируется нулем

.

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

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

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, а не default initialized.

10 голосов
/ 27 сентября 2010

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

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

3 голосов
/ 27 сентября 2010

0

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

0 голосов
/ 27 сентября 2010

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

0 голосов
/ 27 сентября 2010

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

РЕДАКТИРОВАТЬ.Но в принципе вы никогда не должны доверять неинициализированной переменной для хранения чего-то конкретного;Всегда определяйте значения самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...