Inicjalizacja tablicy w C ++

80

jest tą formą inicjalizacji tablicy ze wszystkimi zerami

char myarray[ARRAY_SIZE] = {0} obsługiwane przez wszystkie kompilatory? ,

jeśli tak, czy istnieje podobna składnia do innych typów? na przykład

bool myBoolArray[ARRAY_SIZE] = {false} 
Eli
źródło
Założę się, że dobre pieniądze falseto to samo co 0(w przeciwnym if(false)razie nie oceniłoby to na fałsz), więc to, co masz, prawdopodobnie zadziała na 99% kompilatorów. Nie mogę być pewien pozostałego 1%, dopóki nie zacytujemy normy.
Chris Lutz,
Wiem, że w C int a[10] = { 1, 2, 3 };ustawię a[3]..a[9]na 0(„zainicjowane niejawnie to samo, co obiekty o statycznym czasie trwania”). Czy to dotyczy C ++?
Alok Singhal,
5
Tak. Gdyby nie było to prawdą w przypadku C ++, to C ++ nie byłby nawet zdalnie kompatybilny wstecz z C.
Chris Lutz,
2
falsenie jest tym samym co 0, ale w {0}0 jest konwertowane na false, aw (dla C ++) {}nie musisz nawet przejmować się konwersjami: jest zainicjowany falselub 0lub null-pointer lub jakimkolwiek innym domyślnym z uwzględnieniem typu.
Johannes Schaub - litb

Odpowiedzi:

139

Tak, ta forma inicjalizacji jest obsługiwana przez wszystkie kompilatory C ++. Jest częścią języka C ++. W rzeczywistości jest to idiom, który przyszedł do C ++ z języka C. W języku C = { 0 }jest idiomatycznym uniwersalnym inicjatorem zera . Dotyczy to również prawie C ++.

Ponieważ ten inicjalizator jest uniwersalny, w przypadku booltablic nie potrzebujesz innej „składni”. 0działa również jako inicjator dla booltypu, więc

bool myBoolArray[ARRAY_SIZE] = { 0 };

gwarantuje zainicjowanie całej tablicy za pomocą false. Jak również

char* myPtrArray[ARRAY_SIZE] = { 0 };

gwarantuje zainicjowanie całej tablicy z zerowymi wskaźnikami typu char *.

Jeśli uważasz, że poprawia czytelność, z pewnością możesz użyć

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

ale chodzi o to, że = { 0 }wariant daje dokładnie ten sam wynik.

Jednak w C ++ = { 0 }może nie działać dla wszystkich typów, takich jak na przykład typy wyliczeniowe, których nie można zainicjować za pomocą wartości integralnej 0. Ale C ++ obsługuje krótszą formę

T myArray[ARRAY_SIZE] = {};

czyli tylko pusta para {}. Spowoduje to domyślną inicjalizację tablicy dowolnego typu (zakładając, że elementy pozwalają na domyślną inicjalizację), co oznacza, że ​​w przypadku typów podstawowych (skalarnych) cała tablica zostanie poprawnie zainicjalizowana zerem.

Mrówka
źródło
8
aw c ++ 0x będziesz mógł zainicjalizować coś takiego
jk.
4
Na moim kompilatorze (twórca qt 2.4.1 - qt wersja 4.8.0), jeśli piszę, bool myBoolArray[ARRAY_SIZE] = { false };tablica jest inicjalizowana na false, ale jeśli piszę, bool myBoolArray[ARRAY_SIZE] = { true };tylko pierwszy element jest ustawiony na true, podczas gdy wszystko inne jest fałszywe. Jakieś wyjaśnienie?
początkujący koder
@rookie coder: Wyjaśnienie, czego dokładnie? Czego oczekujesz, że się wydarzy? W C ++, jeśli częściowo zainicjujesz booltablicę, reszta zostanie zainicjalizowana przez zero. Tak już jest.
AnT
1
@AndreyT Dobrze, ale uważam to zachowanie za co najmniej sprzeczne z intuicją. Jeśli nie zainicjuję, na przykład bool myBoolArray[ARRAY_SIZE];, tablica słusznie zawiera losowe wartości, dlatego nie spodziewałbym się, że inicjalizacja może zwrócić tablicę z różnymi wartościami. To wszystko.
początkujący koder
1
@AndreyT: jasne, ale nigdy bym nie pomyślał, że lawina będzie inna niż pierwszy element ;-) W każdym razie dzięki za informacje!
początkujący koder,
18

Zauważ, że '=' jest opcjonalne w uniwersalnej składni inicjalizacji C ++ 11 i ogólnie uważa się, że lepszy styl pisania:

char myarray[ARRAY_SIZE] {0}
nacięcia
źródło
0

Tak, uważam, że powinno działać i można je również zastosować do innych typów danych.

Jednak w przypadku tablic klas, jeśli na liście inicjalizacyjnej jest mniej elementów niż elementów w tablicy, dla pozostałych elementów zostanie użyty domyślny konstruktor. Jeśli dla klasy nie zdefiniowano domyślnego konstruktora, lista inicjatorów musi być kompletna - to znaczy musi istnieć jeden inicjator dla każdego elementu w tablicy.

jasonline
źródło
-1

Możesz zadeklarować tablicę w C ++ w ten sposób. Jeśli znasz rozmiar tablicy, powinieneś zadeklarować tablicę dla: integer: int myArray[array_size]; Double: double myArray[array_size]; Char i string: char myStringArray[array_size]; Różnica między char i string jest następująca

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

Jeśli nie znasz rozmiaru tablicy, powinieneś pozostawić ją pustą, jak poniżej.

liczba całkowita: int myArray[array_size];

Podwójnie: double myArray[array_size];

Tabish
źródło