Proč nemůžeme inicializovat členy uvnitř struktury?

hlasů
43

Proč nemůžeme inicializovat členy uvnitř struktury?

příklad:

struct s {
   int i = 10;
};
Položena 22/10/2008 v 11:01
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
34

Chcete-li inicializovat non-statické členy v struct prohlášení :

V jazyce C ++ (ne C), structsjsou téměř synonymem pro výuku a mohou mít členy inicializovat v konstruktoru.

struct s {
    int i;

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

Chcete-li inicializovat instanci :

V C nebo C ++:

struct s {
    int i;
};

...

struct s s_instance = { 10 };

C99 má také funkci nazvanou určené inicializátory:

struct s {
    int i;
};

...

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

K dispozici je také GNU C rozšíření, která je velmi podobná C99 určených Inicializátory, ale je lepší použít něco více přenosný:

struct s s_instance = {
    i: 10,
};
Odpovězeno 22/10/2008 v 11:03
zdroj uživatelem

hlasů
32

Přímou odpověď je, že definice složení deklaruje typ a nikoli proměnná, která mohou být inicializovány. Váš příklad je:

struct s { int i=10; };

To nevykáže žádnou proměnnou - definuje typ. Deklarovat proměnnou, měli byste přidat název mezi }a ;, a pak byste ji inicializovat později:

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

Jako dáma uvedeno v C99, můžete také použít označený inicializátory (což je úžasné vylepšení - jeden den, bude C dohnat s dalšími funkcemi, které FORTRAN 66 měl pro datovou inicializaci především opakování Inicializátory se zvláštnostmi několikrát). S touto jednoduchou konstrukcí, neexistuje žádná výhoda. Pokud máte strukturu s, řekněme, 20 členů a stačilo k inicializaci jednoho z nich (řekněme, protože máte příznak, který indikuje, že zbytek konstrukce je, nebo není, nastala), je vhodnější:

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

Tento zápis může být také použita k inicializaci odbory, aby si vybrat, který prvek svazu se inicializuje.

Odpovězeno 22/10/2008 v 16:14
zdroj uživatelem

hlasů
8

Všimněte si, že v C ++ 11, toto prohlášení je nyní povoleno:

struct s {
   int i = 10;
};

To je stará otázka, ale řadí vysoko v Google a mohou být také vyjasněna.

Odpovězeno 31/05/2016 v 16:12
zdroj uživatelem

hlasů
8

Edit: Tato otázka byla původně označen c++ale plakátů řekl, že v souvislosti ctakže jsem re-označil otázku, odcházím odpověď i když ...

V C ++ a structje jen classkteré výchozí hodnoty public, spíše než privatepro členy a dědictví.

C ++ umožňuje pouze static constintegrální členům být inicializována inline, ostatní členové musí být inicializována v konstruktoru, nebo v případě, že structje POD v inicializačním seznamu (při deklarování proměnné).

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?" };
Odpovězeno 22/10/2008 v 11:05
zdroj uživatelem

hlasů
2

Nemůžeme inicializovat, protože když jsme deklarovali jakoukoliv strukturu, než ve skutečnosti to, co děláme, jen informovat překladač o jejich přítomnosti tedy bez paměti přidělené pro to i kdybychom inicializovat člena bez vzpomínek na to. Za normálních okolností to, co se stane, když budeme inicializovat jakékoliv proměnné, která závisí na místě, kde jsme deklarovali proměnnou kompilátor přidělit paměť pro tuto proměnnou.

int a = 10;
  • pokud je to auto než v paměti zásobníku bude přidělovat
  • pokud je to celosvětový než v paměti datových sekcí chystá přidělit

Takže to, co paměti je nutné podržet, že data, ale v případě, že struktura není paměť je tam, takže není možné jej inicializovat.

Odpovězeno 14/03/2016 v 18:14
zdroj uživatelem

hlasů
0

Jak jste řekl, že je to jen člen není proměnná. Když deklarujete proměnnou, překladač bude rovněž poskytovat prostor v paměti u těch proměnných, kde si můžete dát hodnoty. V případě člena struct kompilátor není dává paměťový prostor pro to, takže není možné přiřadit hodnoty struct členů, pokud si vytvořit proměnnou tohoto typu struct.

Odpovězeno 31/05/2016 v 16:26
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more