2009-12-17 5 views
68

эта форма intializing массив для всех 0sC++, инициализация массива

char myarray[ARRAY_SIZE] = {0} поддерживаются всеми компиляторами? ,

если да, то есть ли подобный синтаксис для других типов? например

bool myBoolArray[ARRAY_SIZE] = {false} 
+0

Я держал пари хорошие деньги 'false' так же, как '0' (в противном случае' если (ложь) 'бы не оценивать ложь), так, что вам вероятно, будут работать на 99% компиляторов. Не могу быть уверенным в других 1%, пока мы не примем стандарт. –

+0

Я знаю, что в C, 'int a [10] = {1, 2, 3};' будет устанавливать 'a [3] .. a [9]' to '0' (инициализируется неявно так же, как объекты которые имеют статическую продолжительность хранения »). Это верно для C++? –

+4

Да, да. Если это не относится к C++, тогда C++ не будет даже удаленно обратно совместим с C. –

ответ

122

Да, эта форма инициализации поддерживается всеми компиляторами C++. Это часть языка C++. Фактически, это идиома, пришедшая на C++ с языка C. В языке C = { 0 } является идиоматическим универсальным нулевым инициализатором. Это также почти корпус в C++.

Поскольку этот initalizer универсален, для массива bool вам действительно не нужен другой «синтаксис». 0 работает как инициализаторе для bool типа, так что

bool myBoolArray[ARRAY_SIZE] = { 0 }; 

гарантированно инициализировать весь массив с false. А также

char* myPtrArray[ARRAY_SIZE] = { 0 }; 

в гарантированном инициализировать весь массив с нулевыми указателями типа char *.

Если вы считаете, что это улучшает читаемость, можно, конечно, использовать

bool myBoolArray[ARRAY_SIZE] = { false }; 
char* myPtrArray[ARRAY_SIZE] = { nullptr }; 

, но дело в том, что = { 0 } вариант дает точно тот же результат.

Однако, в C++ = { 0 } может не работать для всех типов, например, типов перечислений, которые не могут быть инициализированы интегралом 0. Но C++ поддерживает более короткие виде

T myArray[ARRAY_SIZE] = {}; 

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

+8

и в C++ 0x вы сможете инициализировать что-нибудь вроде этого –

+1

В моем компиляторе (qt creator 2.4.1 - qt version 4.8.0), если я пишу 'bool myBoolArray [ARRAY_SIZE] = {false};' массив все инициализируются как false, но если я пишу 'bool myBoolArray [ARRAY_SIZE] = {true};' только первый элемент имеет значение true, а все остальное - false. Любое объяснение? –

+0

@rookie coder: Объяснение для чего именно? Чего вы ожидаете? В C++, если вы * частично * инициализируете массив 'bool', остальное для вас инициализируется нулем. Так оно и есть. – AnT

0

Да, я считаю, что он должен работать, и он также может применяться к другим типам данных.

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

16

Обратите внимание, что «=» не является обязательной в универсальном синтаксисе инициализации C++ 11, и это, как правило, считается лучшим стилем, чтобы написать:

char myarray[ARRAY_SIZE] {0} 
0

Вы можете объявить массив в C++ в этих типах способов , Если вы знаете размер массива, то вы должны объявить массив для: целого: int myArray[array_size]; Double: double myArray[array_size]; Char и строка: char myStringArray[array_size]; Разницы между полукоксом и строками следующим образом

char myCharArray[6]={'a','b','c','d','e','f'}; 
char myStringArray[6]="abcdef"; 

Если вы не» t знать размер массива, тогда вы должны оставить массив пустым, как показано ниже.

целое: int myArray[array_size];

Double: double myArray[array_size];

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