2008-10-22 55 views
43

¿Por qué no podemos inicializar miembros dentro de una estructura?¿Por qué no podemos inicializar miembros dentro de una estructura?

ejemplo:

struct s { 
    int i = 10; 
}; 
+1

Porque esa es una definición y no una declaración – Archmede

+1

Con C++ reciente podemos ver las respuestas a continuación. (Reciente como en las últimas décadas 'C++.) Sé que esta pregunta fue regrabada C, pero las respuestas en C++ son lo que muchos de nosotros estamos buscando ... – sage

Respuesta

34

Si desea inicializar miembros no estáticos en structdeclaración:

En C++ (no C), structs son casi sinónimo de clases y pueden tener miembros inicializados en el constructor.

struct s { 
    int i; 

    s(): i(10) 
    { 
    } 
}; 

Si desea inicializar un ejemplo:

en C o C++:

struct s { 
    int i; 
}; 

... 

struct s s_instance = { 10 }; 

C99 inicializadores también tiene una característica llamada designados:

struct s { 
    int i; 
}; 

... 

struct s s_instance = { 
    .i = 10, 
}; 

Hay es también una extensión de GNU C que es muy similar a la desi C99 inicializadores gnated, pero es mejor usar algo más portátil:

struct s s_instance = { 
    i: 10, 
}; 
+0

¿Podría por favor elaborar su último ejemplo? – barnes

8

Editar: La pregunta fue originalmente marcadas c++ pero el cartel dijo que está en relación con c así que re-etiquetados a la pregunta, me voy de la respuesta aunque ...

en C++ un struct es sólo un class que de forma predeterminada para public en lugar de private para los miembros y la herencia.

C++ sólo permite static const miembros integrales a ser inicializados en línea, otros miembros deben inicializarse en el constructor, o si el struct es una POD en una lista de inicialización (cuando se declara la variable).

struct bad { 
    static int answer = 42; // Error! not const 
    const char* question = "what is life?"; // Error! not const or integral 
}; 

struct good { 
    static const int answer = 42; // OK 
    const char* question; 
    good() 
     : question("what is life?") // initialization list 
     { } 
}; 

struct pod { // plain old data 
    int answer; 
    const char* question; 
}; 
pod p = { 42, "what is life?" }; 
32

La respuesta directa se debe a que la definición de estructura declara un tipo y no una variable que se puede inicializar. Su ejemplo es:

struct s { int i=10; }; 

Esto no declara ninguna variable - define un tipo. Para declarar una variable, debe agregar un nombre entre la } y la ;, y luego le inicializarlo después:

inicializadores
struct s { int i; } t = { 10 }; 

como inspectores observaron, en C99, también puede utilizar designadas (que es una maravillosa mejora - un día, C se pondrá al día con las otras características que Fortran 66 tenía para la inicialización de datos, principalmente repitiendo inicializadores un número de veces especificado). Con esta estructura simple, no hay beneficio.Si tiene una estructura con, digamos, 20 miembros y solo necesita inicializar una de ellas (digamos porque tiene una bandera que indica que el resto de la estructura está, o no, inicializado), es más útil:

struct s { int i; } t = { .i = 10 }; 

Esta notación también se puede utilizar para inicializar uniones, para elegir qué elemento de la unión se inicializa.

2

No podemos inicializar porque cuando declaramos cualquier estructura de lo que realmente hacemos, simplemente informe al compilador sobre su presencia, es decir, no hay memoria asignada para eso y si inicializamos un miembro sin memoria para eso. Normalmente, lo que sucede cuando inicializamos cualquier variable depende del lugar donde declaramos que el compilador de variables asigna memoria para esa variable.

int a = 10; 
  • si se trata de automóviles que en memoria de pila va a destinar
  • si es mundial que en las secciones de datos de memoria va a destinar

Entonces, ¿qué memoria se necesita para sostener que los datos pero en caso de estructura no hay memoria, por lo que no es posible inicializarla.

+1

¡Si bien su respuesta parece agradable, debería intentar aclararla, corrigiendo sus expresiones, por ejemplo! – gsamaras

+0

ya definitivamente y gracias por la preocupación. –

8

Tenga en cuenta que en C++ 11, la siguiente declaración ahora se permite:

struct s { 
    int i = 10; 
}; 

Ésta es una cuestión de edad, sino que ocupa un lugar destacado en Google y bien podría ser aclarado.

+0

¿Qué es exactamente? ¿Es esto comparable al valor de inicialización de un constructor predeterminado? De ser así: ¿se realizaría también esta asignación si se invoca un constructor de copia o movimiento? – starturtle

+0

Se inserta básicamente en la lista de inicialización de miembros de sus constructores si el miembro no se inicializa explícitamente. – Trass3r

0

Como dijiste, no es más que un miembro, no una variable. Cuando declara una variable, el compilador también proporcionará espacio de memoria para aquellas variables donde puede poner valores. En el caso de un miembro de una estructura, el compilador no le está dando espacio de memoria, por lo que no puede asignar valores a los miembros de la estructura a menos que cree una variable de ese tipo de estructura.

Cuestiones relacionadas