resueltos - ¿Inicialización por defecto de las matrices de miembros de C++?
preguntas de programacion con respuestas (3)
Esta es una pregunta simple, pero parece que no puedo encontrar una respuesta definitiva.
Si tenemos la siguiente clase:
class Test
{
...
char testArray[10];
...
};
Cuando creamos una instancia de Test, ¿cuál es el valor predeterminado de testArray [1]?
Si fuera un arreglo local, no estaría inicializado.
Si fuera una matriz estática, se inicializaría a 0.
¿Qué hace cuando la matriz es un miembro de la clase?
Creo que si no lo inicializa cuando lo declara, puede configurarlo en cualquier cosa. A veces es una dirección o valor de búsqueda aleatoria.
La mejor práctica es inicializar después de declarar.
De la norma, sección 8.5 [dcl.init]
:
Para inicializar por defecto un objeto de tipo
T
significa:
si
T
es una clase de clase (posiblemente calificada para cv) (Cláusula 9), se llama al constructor predeterminado paraT
(y la inicialización no está bien formada siT
no tiene un constructor por defecto accesible);si
T
es un tipo de matriz, cada elemento se inicializa por defecto ;De lo contrario, no se realiza ninguna inicialización.
también la sección 12.6.2 [class.base.init]
:
En un constructor no delegante, si un miembro de datos no estático o una clase base dados no están designados por un id-inicializador-mem (incluido el caso donde no hay una lista-inicializador-mem porque el constructor no tiene inicializador-ctor ) y la entidad no es una clase base virtual de una clase abstracta (10.4), entonces
- si la entidad es un miembro de datos no estáticos que tiene un inicializador con o sin llave , la entidad se inicializa como se especifica en 8.5;
- de lo contrario, si la entidad es un miembro variante (9.5), no se realiza ninguna inicialización;
- de lo contrario, la entidad está inicializada por defecto (8.5).
Entonces, debido a que el tipo de elemento es char
, cuando cada elemento está inicializado por defecto , no se realiza ninguna inicialización. Los contenidos se quedan con valores arbitrarios.
A menos que, por supuesto, sea miembro de una instancia de la clase, y la instancia tenga una duración de almacenamiento estático. Luego, toda la instancia se inicializa con cero , los miembros de la matriz y todos, antes de que comience la ejecución.
Depende de muchos factores que hayas olvidado mencionar.
Si su Test
no tiene un constructor definido por el usuario o su constructor definido por el usuario no hace ningún esfuerzo por inicializar la matriz, y declara el objeto de tipo Test
como
Test test; // no initializer supplied
entonces se comportará exactamente de la misma manera que lo descrito anteriormente. Para un objeto automático (local), el contenido de la matriz seguirá siendo impredecible. Para un objeto estático, el contenido está garantizado como cero.
Si su clase tiene un constructor definido por el usuario, todo dependerá de lo que haga el constructor. De nuevo, tenga en cuenta que los objetos estáticos siempre se inicializan con cero antes de que cualquier constructor tenga la oportunidad de hacer algo.
Si su clase es un agregado, entonces el contenido puede depender del inicializador agregado que proporcionó en la declaración del objeto. Por ejemplo
Test test = {};
inicializará en cero la matriz incluso para un objeto automático (local).