Ініціалізація масиву С ++


80

це така форма ініціалізації масиву для всіх 0

char myarray[ARRAY_SIZE] = {0} підтримується усіма компіляторами? ,

якщо так, чи є синтаксис подібний до інших типів? наприклад

bool myBoolArray[ARRAY_SIZE] = {false} 

Б'юся об заклад, хороші гроші false- це те саме, що 0(інакше if(false)не оцінюватиметься як неправдиве), тому те, що у вас є, напевно, буде працювати на 99% компіляторів. Не можна бути впевненим в інших 1%, поки ми не процитуємо стандарт.
Кріс Луц,

Я знаю, що в C int a[10] = { 1, 2, 3 };буде встановлено a[3]..a[9]значення 0, ("ініціалізується неявно так само, як і об'єкти, які мають статичну тривалість зберігання"). Чи справедливо це для С ++?
Alok Singhal

5
Так. Якби це не відповідало дійсності для C ++, тоді C ++ не був би навіть віддалено зворотно сумісним з C.
Кріс Луц,

2
falseне те ж саме 0, але в {0}0 перетворюється на false, а в (для C ++) {}вам навіть не потрібно дбати про перетворення: він ініціалізується falseабо, 0або нульовий покажчик, або будь-який інший тип, чутливий за замовчуванням.
Йоханнес Шауб - Litb

Відповіді:


139

Так, ця форма ініціалізації підтримується усіма компіляторами C ++. Це частина мови С ++. Насправді це ідіома, яка прийшла до C ++ з мови С. На мові С = { 0 }є ідіоматичним універсальним нульовим ініціалізатором . Це також майже так у C ++.

Оскільки цей ініціалізатор універсальний, для 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 ви зможете ініціалізувати щось подібне
jk.

4
На моєму компіляторі (qt creator 2.4.1 - qt версія 4.8.0), якщо я пишу, bool myBoolArray[ARRAY_SIZE] = { false };масив ініціалізується на false, але якщо я пишу, bool myBoolArray[ARRAY_SIZE] = { true };лише перший елемент має значення true, а все інше - false. Будь-яке пояснення?
програміст-новачок

@rookie coder: Пояснення для чого саме? Що, як ви очікуєте, має статися? У C ++, якщо ви частково ініціалізуєте boolмасив, решта для вас нульова. Це просто так.
AnT

1
@AndreyT Чудово, але я вважаю цю поведінку принаймні протилежною. Якщо я не ініціалізую, наприклад bool myBoolArray[ARRAY_SIZE];, масив по праву містить випадкові значення, тому я б не очікував, що ініціалізація може повернути масив з різними значеннями в ньому. Це все.
програміст-новачок

1
@AndreyT: звичайно, але я ніколи не міг подумати, що лавина буде відрізнятися від першого елемента ;-) У будь-якому разі, дякую за інформацію!
програміст-новачок

18

Зверніть увагу, що '=' є необов’язковим в універсальному синтаксисі ініціалізації C ++ 11, і зазвичай вважається кращим стилем писати:

char myarray[ARRAY_SIZE] {0}

0

Так, я вважаю, що це має спрацювати, і його також можна застосувати до інших типів даних.

Однак для масивів класів, якщо в списку ініціалізатора менше елементів, ніж елементів у масиві, конструктор за замовчуванням використовується для решти елементів. Якщо для класу не визначений конструктор за замовчуванням, список ініціалізатора повинен бути повним - тобто для кожного елемента масиву повинен бути один ініціалізатор.


-1

Ви можете оголосити масив у C ++ такими способами. Якщо ви знаєте розмір масиву, вам слід оголосити масив для: integer: int myArray[array_size]; Double: double myArray[array_size]; Char та string: char myStringArray[array_size]; Різниця між char та string така:

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

Якщо ви не знаєте розмір масиву, вам слід залишити масив порожнім, як показано нижче.

ціле число: int myArray[array_size];

Двомісний номер: double myArray[array_size];

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.