2009-12-17 11 views
68

es esta forma de intializing una matriz para todos 0sC++ array inicialización

char myarray[ARRAY_SIZE] = {0} soportados por todos los compiladores? ,

si es así, ¿existe una sintaxis similar a otros tipos? por ejemplo

bool myBoolArray[ARRAY_SIZE] = {false} 
+0

apuesto buen dinero 'false' es lo mismo que' 0' (de lo contrario, si '(falso)' no se evaluará a falso), así que lo que probablemente funcionará en el 99% de los compiladores. No podemos estar seguros acerca del otro 1% hasta que citemos el estándar. –

+0

Sé que en C, 'int a [10] = {1, 2, 3};' configurará 'a [3] .. a [9]' a '0', (" inicializado implícitamente lo mismo que los objetos que tienen una duración de almacenamiento estática "). ¿Esto es válido para C++? –

+4

Sí, lo hace. Si no fuera cierto para C++ entonces C++ no sería remotamente compatible con C. –

Respuesta

122

Sí, esta forma de inicialización es compatible con todos los compiladores de C++. Es parte del lenguaje C++. De hecho, es un modismo que vino a C++ del lenguaje C. En el lenguaje C = { 0 } es un idiomático cero iniciador universal. Esto también es casi el caso en C++.

Dado que este initalizer es universal, para el arreglo bool realmente no necesita una "sintaxis" diferente. 0 funciona como un inicializador para bool tipo y, por lo

bool myBoolArray[ARRAY_SIZE] = { 0 }; 

está garantizada para inicializar la matriz completa con false. Así como

char* myPtrArray[ARRAY_SIZE] = { 0 }; 

en garantizada para inicializar toda la matriz con nulos triples de tipo char *.

Si usted cree que mejora la legibilidad, que sin duda puede utilizar

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

pero el punto es que = { 0 } variante le da exactamente el mismo resultado.

Sin embargo, en C++ = { 0 } puede que no funcione para todos los tipos, como tipos enum, por ejemplo, que no pueden inicializarse con integral 0. Pero C++ apoya la forma más corta

T myArray[ARRAY_SIZE] = {}; 

es decir, sólo un par vacío de {}. Esto inicializará por defecto una matriz de cualquier tipo (suponiendo que los elementos permitan la inicialización predeterminada), lo que significa que para los tipos básicos (escalares) la matriz completa se inicializará correctamente.

+8

y en C++ 0x podrá inicializar algo como esto –

+1

en mi compilador (qt creador 2.4.1 - versión qt 4.8.0) si escribo 'bool myBoolArray [ARRAY_SIZE] = {false};' la matriz está todo inicializado en falso, pero si escribo 'bool myBoolArray [ARRAY_SIZE] = {true};' solo el primer elemento se establece en verdadero, mientras que todo lo demás es falso. ¿Alguna explicación? –

+0

@rookie coder: Explicación de qué es exactamente? ¿Qué esperas que pase? En C++, si inicializa * parcialmente * una matriz 'bool', el resto se inicializa en cero. Esa es la forma como es. – AnT

0

Sí, creo que debería funcionar y también se puede aplicar a otros tipos de datos.

Para las matrices de clases, si hay menos elementos en la lista de inicializadores que los elementos de la matriz, el constructor predeterminado se utiliza para los elementos restantes. Si no se define un constructor predeterminado para la clase, la lista de inicializadores debe estar completa; es decir, debe haber un inicializador para cada elemento en la matriz.

16

Tenga en cuenta que el '=' es opcional en la sintaxis de inicialización universal de C++ 11, y por lo general se considera mejor estilo de escribir:

char myarray[ARRAY_SIZE] {0} 
0

Usted puede declarar la matriz en C++ en este tipo de formas . Si conoce el tamaño de la matriz, entonces debería declarar la matriz para: entero: int myArray[array_size]; doble: double myArray[array_size]; Char y la cadena: char myStringArray[array_size]; La diferencia entre el carbón y la cadena es el siguiente

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

Si no' Si conoce el tamaño de la matriz, debe dejar la matriz en blanco como se muestra a continuación.

entero: int myArray[array_size];

doble: double myArray[array_size];