C ++ - Array-Initialisierung

80

ist diese Form der Initialisierung eines Arrays auf alle Nullen

char myarray[ARRAY_SIZE] = {0} von allen Compilern unterstützt? ,

Wenn ja, gibt es eine ähnliche Syntax wie bei anderen Typen? zum Beispiel

bool myBoolArray[ARRAY_SIZE] = {false} 
Eli
quelle
Ich wette, gutes Geld falseist dasselbe wie 0(sonst if(false)würde es nicht als falsch bewertet), also wird das, was Sie haben, wahrscheinlich auf 99% der Compiler funktionieren. Ich kann mir über die anderen 1% nicht sicher sein, bis wir den Standard zitieren.
Chris Lutz
Ich weiß , dass in C, int a[10] = { 1, 2, 3 };wird eingestellt a[3]..a[9]auf 0( „implizit das gleiche wie Objekte initialisiert , die statische Speicherdauer haben“). Gilt das für C ++?
Alok Singhal
5
Ja tut es. Wenn dies für C ++ nicht zutreffen würde, wäre C ++ nicht einmal remote abwärtskompatibel mit C.
Chris Lutz
2
falseist nicht dasselbe wie 0, aber in {0}0 wird in konvertiert false, und in (für C ++) müssen {}Sie sich nicht einmal um Konvertierungen kümmern: Es wird auf falseoder 0oder Nullzeiger oder einen anderen typsensitiven Standard initialisiert .
Johannes Schaub - litb

Antworten:

139

Ja, diese Form der Initialisierung wird von allen C ++ - Compilern unterstützt. Es ist Teil der C ++ - Sprache. Tatsächlich ist es eine Redewendung, die aus der C-Sprache zu C ++ kam. In der Sprache C = { 0 }ist ein idiomatischer universeller Nullinitialisierer . Dies ist auch in C ++ fast der Fall.

Da dieser Initializer universell ist, boolbenötigen Sie für Arrays keine andere "Syntax". 0funktioniert also auch als Initialisierer für den boolTyp

bool myBoolArray[ARRAY_SIZE] = { 0 };

wird garantiert, um das gesamte Array mit zu initialisieren false. Ebenso gut wie

char* myPtrArray[ARRAY_SIZE] = { 0 };

Es wird garantiert, dass das gesamte Array mit Nullzeigern vom Typ initialisiert wird char *.

Wenn Sie glauben, dass es die Lesbarkeit verbessert, können Sie es auf jeden Fall verwenden

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

Aber der Punkt ist, dass die = { 0 }Variante genau das gleiche Ergebnis liefert .

In C ++ = { 0 }funktioniert dies jedoch möglicherweise nicht für alle Typen, z. B. Aufzählungstypen, die nicht mit Integral initialisiert werden können 0. C ++ unterstützt jedoch die kürzere Form

T myArray[ARRAY_SIZE] = {};

dh nur ein leeres Paar {}. Dadurch wird ein Array eines beliebigen Typs standardmäßig initialisiert (vorausgesetzt, die Elemente erlauben eine Standardinitialisierung). Dies bedeutet, dass für grundlegende (skalare) Typen das gesamte Array ordnungsgemäß auf Null initialisiert wird.

Ameise
quelle
8
und in c ++ 0x können Sie so etwas initialisieren
jk.
4
Wenn ich auf meinem Compiler (qt Creator 2.4.1 - qt Version 4.8.0) schreibe, wird bool myBoolArray[ARRAY_SIZE] = { false };das Array auf false initialisiert, aber wenn ich schreibe, wird bool myBoolArray[ARRAY_SIZE] = { true };nur das erste Element auf true gesetzt, während alles andere auf false gesetzt ist. Irgendeine Erklärung?
Rookie Coder
@rookie coder: Erklärung für was genau? Was erwarten Sie, sollte passieren? Wenn Sie in C ++ ein Array teilweise initialisieren bool, wird der Rest für Sie mit Null initialisiert. So ist es nun einmal.
AnT
1
@AndreyT Gut, aber ich finde dieses Verhalten zumindest kontraintuitiv. Wenn ich nicht initialisiere, bool myBoolArray[ARRAY_SIZE];enthält das Array zu Recht zufällige Werte, daher hätte ich nicht erwartet, dass eine Initialisierung ein Array mit anderen Werten zurückgeben könnte. Das ist alles.
Rookie Coder
1
@AndreyT: sicher, aber ich hätte nie gedacht, dass die Lawine anders gewesen wäre als das erste Element ;-) Trotzdem danke für die Infos!
Rookie Coder
18

Beachten Sie, dass das '=' in der universellen Initialisierungssyntax von C ++ 11 optional ist und allgemein als besserer Schreibstil angesehen wird:

char myarray[ARRAY_SIZE] {0}
schneidet ein
quelle
0

Ja, ich glaube, es sollte funktionieren und es kann auch auf andere Datentypen angewendet werden.

Wenn für Klassenarrays weniger Elemente in der Initialisierungsliste als Elemente im Array enthalten sind, wird der Standardkonstruktor für die verbleibenden Elemente verwendet. Wenn für die Klasse kein Standardkonstruktor definiert ist, muss die Initialisiererliste vollständig sein, dh für jedes Element im Array muss ein Initialisierer vorhanden sein.

jasonline
quelle
0

Sie können das Array in C ++ auf diese Weise deklarieren. Wenn Sie die Arraygröße kennen, sollten Sie das Array für Folgendes deklarieren: Ganzzahl: int myArray[array_size]; Double: double myArray[array_size]; Zeichen und Zeichenfolge: char myStringArray[array_size];Der Unterschied zwischen Zeichen und Zeichenfolge ist wie folgt

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

Wenn Sie die Größe des Arrays nicht kennen, sollten Sie das Array wie folgt leer lassen.

ganze Zahl: int myArray[array_size];

Doppelt: double myArray[array_size];

Tabish
quelle