2010-08-27 2 views
4
WCHAR wszFoo[CONSTANT_BAR] = {0}; 

Я никогда не видел что-то вроде {0}, используемого в C++, как часть языка. И я понятия не имею, как искать такой вопрос, как этот онлайн. Что это?WCHAR wszFoo [CONSTANT_BAR] = {0}; <- Что означает {0}?

+0

Вот почему я абсолютно ненавижу **, что люди это делают. Если вы хотите инициализировать нулевой нуль, используйте вызов 'memset' (или' ZeroMemory' или 'SecureZeroMemory') или * пустой * набор скобок. Добавление дополнительного нуля приводит только к путанице. +1 –

ответ

3

$ 8.5.1/7 -

«Если есть меньше Инициализаторы в список, чем члены в совокупности, то каждый член не явно инициализировано должно быть инициализировано значение (8.5). "

Все это означает, что существует запрос экспликации для инициализации первого элемента до 0. Поскольку инициализаторы не указаны для остальных элементов, они инициализируются значением. Это в случае средств WCHARs инициализируется равным 0.

Что означает инициализация значения? Вот что говорит стандарт в 8,5 $ (курсив мой)

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

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

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

- если T является массивом , то каждый элемент равен value-initialized;

- в противном случае, объект нулевой инициализируется < ------ WCHAR поместится здесь

к нулю инициализировать объект типа T означает:

- если T - скалярный тип (3.9), для объекта установлено значение 0 (ноль), преобразованное в T; < ------ WCHAR поместится здесь

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

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

- если T - тип массива, каждый элемент равен zero-initialized;

- если T является эталонный тип, без инициализации выполнен.

+0

Спасибо! Когда я прочитал другие ответы, я подумал: «Ну, тогда что произойдет, если это массив классов?» Итак, вы побеждаете, потому что вы тоже это ответили :) – Marcus

6

См array initialization.

Пропущенные значения инициализации использовать нулевой

Если явный размер массива указан, но короче список initiliazation указано, что неопределенные элементы установлены на ноль.

float pressure[10] = {2.101, 2.32, 1.44};

инициализирует Это не только первые три значения, но все остальные элементы установлены на 0.0. Чтобы инициализировать массив для всех нулей, инициализируйте только первое значение.

+0

Aha! Мне никогда не приходило в голову, что это инициализировало массив. Я бы сразу понял, была ли запятая, но {0} обычно означает что-то совершенно другое в другом содержимом (например, C# String.Format()) – Marcus

2

Это означает, что все элементы wszFoo равны нулю.

3

Он инициализирует массив.

float p1[1000];   // No intitialization. 
float p2[1000] = {0.0}; // All 1000 values initialized to zero. 

Подробнее здесь: C++ Notes: Array Initialization

Смежные вопросы