WCHAR wszFoo[CONSTANT_BAR] = {0};
Я никогда не видел что-то вроде {0}, используемого в C++, как часть языка. И я понятия не имею, как искать такой вопрос, как этот онлайн. Что это?WCHAR wszFoo [CONSTANT_BAR] = {0}; <- Что означает {0}?
WCHAR wszFoo[CONSTANT_BAR] = {0};
Я никогда не видел что-то вроде {0}, используемого в C++, как часть языка. И я понятия не имею, как искать такой вопрос, как этот онлайн. Что это?WCHAR wszFoo [CONSTANT_BAR] = {0}; <- Что означает {0}?
$ 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 является эталонный тип, без инициализации выполнен.
Спасибо! Когда я прочитал другие ответы, я подумал: «Ну, тогда что произойдет, если это массив классов?» Итак, вы побеждаете, потому что вы тоже это ответили :) – Marcus
Пропущенные значения инициализации использовать нулевой
Если явный размер массива указан, но короче список initiliazation указано, что неопределенные элементы установлены на ноль.
float pressure[10] = {2.101, 2.32, 1.44};
инициализирует Это не только первые три значения, но все остальные элементы установлены на 0.0. Чтобы инициализировать массив для всех нулей, инициализируйте только первое значение.
Aha! Мне никогда не приходило в голову, что это инициализировало массив. Я бы сразу понял, была ли запятая, но {0} обычно означает что-то совершенно другое в другом содержимом (например, C# String.Format()) – Marcus
Это означает, что все элементы wszFoo
равны нулю.
Он инициализирует массив.
float p1[1000]; // No intitialization.
float p2[1000] = {0.0}; // All 1000 values initialized to zero.
Подробнее здесь: C++ Notes: Array Initialization
Вот почему я абсолютно ненавижу **, что люди это делают. Если вы хотите инициализировать нулевой нуль, используйте вызов 'memset' (или' ZeroMemory' или 'SecureZeroMemory') или * пустой * набор скобок. Добавление дополнительного нуля приводит только к путанице. +1 –