variable una que inicializar inicialización globales formas como caracter c++
el capítulo "Inicialización de agregados"

una - que es inicializar en c++



¿Qué es la inicialización agregada? (2)

En primer lugar, para responder a la pregunta principal, la inicialización agregada significa el uso de listas de inicialización entre llaves para inicializar todos los miembros de un agregado (es decir, una matriz o estructura [en C ++, solo ciertos tipos de estructuras cuentan como agregados]).

Obviamente,

int ar[] = { 1 , 2 };

es más seguro que

int ar[2]; ar[0] = 1; ar[1] = 2;

porque este último ofrece una amplia oportunidad para que se tipifiquen los errores tipográficos y otros errores en los índices de los elementos individuales.

Mirando el C y C ++ de hoy, no me queda claro por qué el autor hace una distinción entre C y C ++. Ambos lenguajes permiten la inicialización agregada para matrices.

Una posibilidad es que el autor se refiera a versiones antiguas del Estándar C. Notablemente, en ANSI C (C89) se aplicó una restricción importante al uso de la inicialización agregada: todos los inicializadores tenían que ser expresiones constantes:

/* This is possible in C89: */ f(int i) { int ar[] = { 1 , 2 }; } /* But this is not (because i is not a constant expression): */ f(int i) { int ar[] = { i , i+1 }; }

Esto se debe a 3.5.7 en C89 (citando el borrador que encontré here ):

Todas las expresiones en un inicializador para un objeto que tiene una duración de almacenamiento estático o en una lista de inicializadores para un objeto que tiene un tipo agregado o de unión serán expresiones constantes.

Esto limita claramente la utilidad de la inicialización agregada (e incluso en 1989, creo que muchos compiladores implementaron extensiones para permitir la inicialización agregada también para expresiones no constantes).

Las versiones posteriores del Estándar C no tenían esta restricción, y las versiones estandarizadas de C ++ (comenzando con C ++ 98), creo, nunca tuvieron tal restricción.

Solo puedo especular, pero tal vez esto es lo que el autor tenía en mente?

La sección "Inicialización de matrices" en el Capítulo 4, página 231 de "Pensando en Java, 2ª edición" dice lo siguiente:

La inicialización de matrices en C es propensa a errores y tediosa. C ++ usa la inicialización agregada para hacerla mucho más segura. Java no tiene "agregados" como C ++, ya que todo es un objeto en Java. Tiene matrices, y éstas son compatibles con la inicialización de matrices.

¿Por qué es propenso y tedioso el error en C? ¿Qué significa la inicialización agregada y por qué es más segura? Encontré el capítulo "Inicialización de agregados" en "Pensando en C ++" de Bruce Eckel (2da edición), pero no me convence de nada.


Supongo que el autor le está advirtiendo sobre la falta de cumplimiento de restricciones de tamaño en C y C ++. En C y C ++, las matrices decaen hasta los punteros a su primer elemento. Luego utiliza la aritmética de punteros para encontrar el elemento al que se refiere por índice. Como los arreglos no son objetos y el compilador no hace ningún esfuerzo por almacenar su tamaño, no hay controles de longitud. En java, las matrices son objetos y, por lo tanto, su tamaño es conocido. Se puede verificar este tamaño, lo que evita que el desarrollador acceda a la memoria que no le pertenece cuando sobrepasa los límites de la matriz.

Me parece extraño que la declaración "C ++ usa inicialización agregada para hacerlo mucho más seguro" incluso se usó en este contexto.

La inicialización agregada, que es común a la mayoría de los lenguajes modernos, es la siguiente

int intArray[3] = {1,2,3}; int int2DArray[2][2] = {{1,2}, {3,4}};

Este tipo de inicialización asume que usted sabe de antemano el tamaño de la matriz y su contenido. Este tipo de seguridad de inicialización protege uno sobrepasando el límite y permite inicializar una matriz con valores establecidos. Tal vez en este caso el autor tenga en mente a un desarrollador que declaró una matriz C estática de tamaño 5. Luego, este desarrollador crea un bucle para inicializar su contenido, pero sobrepasa el límite de la matriz en uno, escribiendo en la memoria que no es suya. suyo.