initialize examples declarar array c++ c++11 array-initialization member-initialization

c++ - examples - initialize array labview



¿Se pueden inicializar los miembros de la matriz auto-referencialmente? (4)

Considere el siguiente código en el que inicializamos parte de D base a otra parte de D :

struct c { c() : D{rand(), D[0]} {} int D[2]; }; int main() { c C; assert(C.D[0] == C.D[1]); }

¿Está bien definido el programa anterior? ¿Podemos usar con seguridad una parte de la misma matriz para inicializar otra parte?


¿Se pueden inicializar los miembros de la matriz auto-referencialmente?

Sí.

struct c { int a[3]; c() : a{4, a[0], 3} {} // a[0] is initialized to 4. // a[1] is initialized to whatever a[0] is. (4) // a[2] is initialized to 3. };

Pero considera este ejemplo:

struct c { int a[3]; c() : a{a[1], 4, a[1]} {} // a[0] is initialized to whatever a[1] is.(Garbage value) // a[1] is initialized to 4. // a[2] is initialized to what a[1] is now (4). };

Aquí, el primer elemento en a será el valor que esté en a[1] , que probablemente será el valor de basura. El segundo elemento se inicializa a 4 y el tercer elemento se inicializa a lo que ahora se encuentra en a[1] , que es el valor 4 .

Además, cuando no se enumeran todos los elementos de la matriz dentro de {} , los elementos que no están listados, se inicializarán por defecto:

struct c { int a[5]; // notice the size c() : a{a[1], 2, 3, 4}{} // a[0] will get value that is in a[1] // but since a[1] has garbage value, // it will be default initialized to 0. // a[1] = 2 // a[2] = 3 // a[3] = 4 // a[4] is not listed and will get 0. };

Sin embargo, listar un elemento ya inicializado le dará el valor que desea.
Usando el ejemplo anterior:

struct c { int a[5]; c() : a{1, a[0], 3, 4}{} // a[0] = 1 // a[1] = 1 // a[2] = 3 // a[3] = 4 // a[4] is not listed and will get 0. };


No es una buena práctica escribir D{rand(),D[0]} , porque cuando se ejecuta el constructor no es necesario que primero se ejecute rand () y luego D [0], todo depende del compilador , D [0] podría ejecutarse primero, en ese caso d [1] contendrá el valor de basura. Depende completamente del compilador, puede compilar el segundo argumento primero y luego el primer argumento o viceversa, ejecutar esta declaración puede resultar en un comportamiento desconocido.


Cuando los agregados (incluidas las matrices) se inicializan desde una lista de arriostramiento, cada elemento agregado se inicializa desde el elemento correspondiente de la lista ("en subíndice creciente o orden de miembro"). Aunque no puedo encontrar una regla exacta que diga que la inicialización de cada elemento se secuencia después de la anterior, hay un ejemplo en la Norma que claramente implica que este es el significado deseado. El ejemplo está en [dcl.init.aggr]:

struct S { int a; const char* b; int c; int d = b[a]; }; S ss = { 1, "asdf" };

inicializa ss.a con 1 , ss.b con "asdf" , ss.c con el valor de una expresión de la forma int{} (es decir, 0 ), y ss.d con el valor de ss.b[ss.a] (es decir, ''s'' )


Según cppreference.com :

Los efectos de la inicialización agregada son:

Cada elemento de la matriz o miembro de la clase no estática, en orden de subíndice / apariencia de la matriz en la definición de la clase, se inicializa con copia de la cláusula correspondiente de la lista de inicializadores.

Tu código parece estar bien. Sin embargo es algo confuso.