Warum können wir Mitglieder innerhalb einer Struktur nicht initialisieren?

Lesezeit: 4 Minuten

Benutzeravatar von Santhosh
Santhosh

Warum können wir Mitglieder innerhalb einer Struktur nicht initialisieren?

Beispiel:

struct s {
   int i = 10;
};

  • Denn das ist eine Definition und keine Deklaration

    – Archmed

    1. Mai 2017 um 23:18 Uhr

Benutzeravatar von Alex B
Alex B

Wenn Sie initialisieren möchten nicht statisch Mitglieder ein struct Erklärung:

In C++ (nicht C), structs sind fast gleichbedeutend mit Klassen und können Member im Konstruktor initialisieren.

struct s {
    int i;

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

Wenn Sie eine initialisieren möchten Beispiel:

In C oder C++:

struct s {
    int i;
};

...

struct s s_instance = { 10 };

C99 hat auch eine Funktion namens designierte Initialisierer:

struct s {
    int i;
};

...

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

Es gibt auch eine GNU-C-Erweiterung, die C99-Designated-Initialisierern sehr ähnlich ist, aber es ist besser, etwas Tragbareres zu verwenden:

struct s s_instance = {
    i: 10,
};

Die direkte Antwort ist, weil die Strukturdefinition einen Typ deklariert und keine Variable, die initialisiert werden kann. Ihr Beispiel ist:

struct s { int i=10; };

Dies deklariert keine Variable – es definiert einen Typ. Um eine Variable zu deklarieren, würden Sie einen Namen zwischen hinzufügen } und die ;und dann würdest du es danach initialisieren:

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

Wie Checkers feststellte, können Sie in C99 auch designierte Initialisierer verwenden (was eine wunderbare Verbesserung darstellt – eines Tages wird C die anderen Funktionen von Fortran 66 für die Dateninitialisierung einholen und in erster Linie Initialisierer eine festlegbare Anzahl von Malen wiederholen). Bei dieser einfachen Struktur gibt es keinen Vorteil. Wenn Sie eine Struktur mit beispielsweise 20 Mitgliedern haben und nur eines davon initialisieren müssen (z. B. weil Sie ein Flag haben, das angibt, ob der Rest der Struktur initialisiert ist oder nicht), ist dies nützlicher:

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

Diese Notation kann auch zum Initialisieren von Unions verwendet werden, um auszuwählen, welches Element der Union initialisiert wird.

Beachten Sie, dass in C++ 11 jetzt die folgende Deklaration erlaubt ist:

struct s {
   int i = 10;
};

Dies ist eine alte Frage, aber sie rangiert bei Google ganz oben und könnte genauso gut geklärt werden.

  • Was genau macht es? Ist dies vergleichbar mit dem Initialisierungswert eines Standardkonstruktors? Wenn ja: Würde diese Zuweisung auch ausgeführt, wenn ein Kopier- oder Verschiebekonstruktor aufgerufen wird?

    – Startschildkröte

    1. August 2016 um 14:35 Uhr

  • Es wird grundsätzlich in die Member-Initialisierungsliste Ihres Konstruktors eingefügt, wenn das Member nicht explizit initialisiert wird.

    – Trass3r

    18. September 2017 um 14:25 Uhr

  • Ist das irgendwo dokumentiert?

    – Andrew Truckle

    2. Juli 2018 um 18:01 Uhr

Benutzeravatar von Motti
Motti

Edit2: Diese Antwort wurde 2008 geschrieben und bezieht sich auf C++98. Die Regeln für die Member-Initialisierung haben sich in nachfolgenden Versionen der Sprache geändert.

Bearbeiten: Die Frage war ursprünglich markiert c++ aber das Plakat sagte, es ist bezüglich c Also habe ich die Frage neu markiert, ich lasse die Antwort aber …

In C++ a struct ist nur ein class welche Vorgabe für public statt private für Mitglieder und Erbschaften.

C++ erlaubt nur static const Ganzzahlige Member, die inline initialisiert werden sollen, müssen andere Member im Konstruktor initialisiert werden, oder wenn die struct ist ein POD in einer Initialisierungsliste (bei Deklaration der Variablen).

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?" };

Benutzeravatar von Anup Raj Dubey
Anup Raj Dubey

Wir können nicht initialisieren, denn wenn wir eine Struktur als eigentlich deklariert haben, informieren Sie den Compiler einfach über ihre Anwesenheit, dh es wurde kein Speicher dafür zugewiesen und wenn wir Member ohne Speicher dafür initialisieren. Normalerweise passiert, was passiert, wenn wir eine Variable initialisieren, die von der Stelle abhängt, an der wir den Variablen-Compiler deklariert haben, um Speicher für diese Variable zuzuweisen.

int a = 10;
  • Wenn es automatisch ist, wird der Stapelspeicher zugewiesen
  • Wenn es global ist, wird der Speicher in Datenabschnitten zugewiesen

Welcher Speicher ist also erforderlich, um diese Daten zu speichern, aber im Falle einer Struktur ist kein Speicher vorhanden, sodass es nicht möglich ist, sie zu initialisieren.

  • Auch wenn Ihre Antwort nett erscheint, sollten Sie versuchen, sie deutlicher zu machen, indem Sie beispielsweise Ihre Formulierungen korrigieren!

    – Gsamaras

    14. März 2016 um 18:20 Uhr

Benutzeravatar von Ajay Sivan
Ajai Sivan

Wie Sie sagten, ist es nur ein Mitglied, keine Variable. Wenn Sie eine Variable deklarieren, stellt der Compiler auch Speicherplatz für diese Variablen bereit, in die Sie Werte einfügen können. Im Fall eines Strukturmitglieds gibt der Compiler keinen Speicherplatz dafür, sodass Sie Strukturmitgliedern keine Werte zuweisen können, es sei denn, Sie erstellen eine Variable dieses Strukturtyps.

  • Auch wenn Ihre Antwort nett erscheint, sollten Sie versuchen, sie deutlicher zu machen, indem Sie beispielsweise Ihre Formulierungen korrigieren!

    – Gsamaras

    14. März 2016 um 18:20 Uhr

1412940cookie-checkWarum können wir Mitglieder innerhalb einer Struktur nicht initialisieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy