2009-12-17 7 views
68

est présent sous forme d'un tableau à initialisation de tous les 0sinitialisation de la matrice C++

char myarray[ARRAY_SIZE] = {0} supportés par tous les compilateurs? ,

Si oui, existe-t-il une syntaxe similaire aux autres types? par exemple

bool myBoolArray[ARRAY_SIZE] = {false} 
+0

Je parie que l'argent 'false' est le même que '0' (sinon' si (false) 'n'évaluer false), donc ce que vous Je vais probablement travailler sur 99% des compilateurs. Je ne peux pas être sûr de l'autre 1% jusqu'à ce que nous citons la norme. –

+0

Je sais que dans C, 'int a [10] = {1, 2, 3};' va mettre 'a [3] .. a [9]' '0', (" initialisé implicitement de la même façon que les objets qui ont une durée de stockage statique "). Cela est-il vrai pour C++? –

+4

Oui, c'est le cas. Si elle n'était pas vraie pour C++ alors C++ ne serait même pas rétrocompatible avec C. –

Répondre

122

Oui, cette forme d'initialisation est prise en charge par tous les compilateurs C++. C'est une partie du langage C++. En fait, c'est un idiome qui est venu à C++ du langage C. En langage C = { 0 } est un idiomatique zéro-initialiseur universel. C'est aussi presque le cas en C++.

Depuis cette initalizer est universel, pour bool tableau que vous avez vraiment pas besoin d'un autre « syntaxe ». 0 fonctionne comme un initialiseur pour le type bool aussi bien, donc

bool myBoolArray[ARRAY_SIZE] = { 0 }; 

est garantie pour initialiser le tableau entier avec false. En plus

char* myPtrArray[ARRAY_SIZE] = { 0 }; 

en garantie pour initialiser le tableau entier avec null-pointeurs de type char *.

Si vous croyez améliore la lisibilité, vous pouvez certainement utiliser

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

mais le point est que = { 0 } variante vous donne exactement le même résultat. Cependant, en C++ = { 0 } peut ne pas fonctionner pour tous les types, comme les types enum, par exemple, qui ne peut pas être initialisé avec 0 intégral. Mais C++ prend la forme plus courte

T myArray[ARRAY_SIZE] = {}; 

à-dire juste une paire de {} vide. Cela initialise par défaut un tableau de n'importe quel type (en supposant que les éléments autorisent l'initialisation par défaut), ce qui signifie que pour les types basiques (scalaires), le tableau entier sera correctement initialisé à zéro.

+8

et en C++ 0x, vous serez en mesure d'initialiser quelque chose comme ça –

+1

Sur mon compilateur (qt créateur 2.4.1 - qt version 4.8.0) si j'écris 'bool myBoolArray [ARRAY_SIZE] = {false};' le tableau Tout est initialisé à false, mais si j'écris 'bool myBoolArray [ARRAY_SIZE] = {true};' seul le premier élément est défini sur true, alors que tout le reste est faux. Toute explication? –

+0

@rookie coder: Explication pour quoi exactement? Qu'attendez-vous devrait arriver? En C++, si vous initialisez * partiellement * un tableau 'bool', le reste est initialisé à zéro pour vous. C'est comme ça. – AnT

0

Oui, je crois que cela devrait fonctionner et il peut également être appliqué à d'autres types de données.

Pour les tableaux de classe bien, s'il y a moins d'éléments dans la liste des initialiseur que les éléments du tableau, le constructeur par défaut est utilisé pour les autres éléments. Si aucun constructeur par défaut n'est défini pour la classe, la liste d'initialisation doit être complète, c'est-à-dire qu'il doit y avoir un initialiseur pour chaque élément du tableau.

16

Notez que le « = » est facultative dans 11 syntaxe d'initialisation universelle C du, et il est généralement considéré comme un meilleur style à écrire:

char myarray[ARRAY_SIZE] {0} 
0

Vous pouvez déclarer le tableau en C++ dans ce type de moyens . Si vous connaissez la taille du tableau, vous devez déclarer le tableau pour: entier: int myArray[array_size]; Double: double myArray[array_size]; Char et string: char myStringArray[array_size]; La différence entre l'omble chevalier et la chaîne est la suivante

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

Si vous n » t connaître la taille du tableau, alors vous devriez laisser le tableau vide comme suit.

entier: int myArray[array_size];

Double: double myArray[array_size];