2011-06-27 14 views
7

Si tengo una estructura con un miembro de la matriz y llamo explícitamente al constructor predeterminado de la matriz en el constructor de la estructura, ¿los elementos se construirán por defecto? (En el caso de una matriz de enteros, esto significaría obtener inicialización cero).¿Construirá por defecto una matriz de enteros con inicialización cero?

struct S 
{ 
    S() : array() {} 

    int array[SIZE]; 
}; 

... 

S s; 
// is s.array zero-initialized? 

Una prueba rápida con gcc sugiere que este es el caso, pero quería confirmar que puedo confiar en este comportamiento.

(I han dado cuenta de que si no explícitamente default-construir la matriz en el constructor estructura, los elementos de la matriz tienen valores aleatorios.)

+2

¿Alguna razón en particular por la que no está utilizando 'std :: vector'? – AJG85

+2

@ AJG85: Sí. Si asigno una matriz de 100000 de estas estructuras, me gustaría que resulte en una única asignación de 100000 * TAMAÑO de bytes, en lugar de una única asignación de 100000 * tamaño de (int *) bytes más 100000 asignaciones de TAMAÑO de bytes. (Por otro lado, yo * podría * ser un poco más C++ - y usando 'boost :: array' (o' std :: array' en C++ 0x)). – HighCommander4

+3

@ High: Su modelo mental de 'std :: vector ' es completamente incorrecto. Tiene una sobrecarga constante de aproximadamente 12 bytes más algunos gastos generales en la tienda libre. – fredoverflow

Respuesta

12

Sí (mina destacando):

(C++ 03 8,5)

Para valor-inicializar un objeto de tipo T significa:

  • si T es un tipo de clase (cláusula 9) con un constructor declarado por el usuario (12.1), entonces se llama al constructor predeterminado para T (y la inicialización está mal formada si T no tiene un constructor por defecto accesible);

  • si T es un tipo de clase no unión sin un constructor-declarado de usuario, entonces cada no estático> miembro de datos y el componente de clase base de T es de valor inicializado

  • si T es un tipo de matriz , entonces cada elemento tiene un valor inicializado;

  • de otro modo, el objeto se inicializa-cero

...

Un objeto cuya inicializador es un conjunto vacío de paréntesis, es decir,(), será valor -inicializado

+0

Sí, tiene razón, S está inicializado por defecto. Eso significa que la matriz dentro está inicializada demasiado por defecto, porque S es un POD, y la inicialización predeterminada para una matriz no es lo mismo que inicialización cero –

+0

Lo siento, no había notado el constructor, y pensé que era un POD . Lo siento, tu respuesta es correcta –

+0

+1: Para editar para cubrir todas las bases. – AJG85

Cuestiones relacionadas