Aggregation Initialisierung Sicherheit in C ++

8

Angenommen, ich habe die folgende Struktur:

%Vor%

Und wenn ich verwendet werde, möchte ich Variablen von sampleData type in einen bekannten Zustand initialisieren.

%Vor%

Später entscheide ich, dass ich zusätzliche Daten in meiner sampleData struct wie folgt benötigen:

%Vor%

Ich verstehe, dass die Initialisierung der beiden Felder, die von meiner Datenstruktur pre z übriggeblieben ist, immer noch eine gültige Anweisung ist und kompiliert wird, indem die fehlenden Felder mit Standardwerten gefüllt werden.

Stimmt dieses Verständnis? Ich habe vor kurzem in Ada gearbeitet, das auch Aggregat-Initialisierung erlaubt, aber das ein ähnliches Problem als ein Kompilierungsfehler kennzeichnen würde. Unter der Annahme, dass meine Annahmen zum C ++ - Code korrekt sind, gibt es ein Sprachkonstrukt, das fehlende Initialisierungswerte als Fehler erkennt?

    
Greg 08.06.2011, 20:00
quelle

4 Antworten

5

Das Initialisieren von Variablen auf diese Weise wird nur mit Aggregate-Klassen unterstützt.

Wenn Sie dann Konstruktoren hinzufügen, verschwindet das Problem, aber Sie müssen die Syntax ein wenig ändern und Sie verlieren die Möglichkeit, struct in union (unter anderem) zu speichern.

%Vor%

Wenn Sie z hinzufügen (und den Konstruktor ändern), wird sample( 1, 2 ) als Kompilierfehler markiert.

    
Peter Alexander 08.06.2011, 20:06
quelle
4

Ja, alle Elemente, die Sie von der Initialisierungsliste weglassen, werden auf Null (für POD-Skalartypen) oder ihren Standardkonstruktor (für Klassen) initialisiert.

Die relevante Sprache aus dem C-Standard wird hier angegeben:

  

[6.7.8.21] Wenn in einer geschweiften Klammer weniger Initialisierer vorhanden sind als Elemente oder Elemente eines Aggregats oder weniger Zeichen in einem Zeichenfolgenliteral verwendet werden, um ein Array bekannter Größe zu initialisieren, als es Elemente in dem Array gibt Array, der Rest des Aggregats wird implizit genauso initialisiert wie Objekte mit statischer Speicherdauer.

Ich bin sicher, dass jemand motivierter als ich die entsprechende Sprache in einer der C ++ - Spezifikationen finden könnte ...

Beachten Sie, dass dies bedeutet, dass POD-Skalarelemente so initialisiert werden, als ob Sie "= 0" geschrieben hätten. Dies bedeutet, dass Zeiger auf NULL korrekt initialisiert und auf 0 gesetzt werden, auch wenn ihre Repräsentationen nicht Nullbytes sind. Es impliziert auch, dass es rekursiv arbeitet; Wenn Ihre Struktur eine Struktur enthält, wird die innere Struktur ebenfalls korrekt initialisiert.

    
Nemo 08.06.2011 20:05
quelle
4

Als Antwort auf Nemos Antwort mit der C-Standardschrift folgt hier der C ++ 03-Standard:

§8.5.1 / 7:

  

Wenn es in der Liste weniger Initialisierer gibt als Mitglieder im Aggregat, dann muss jedes nicht explizit initialisierte Element initialisiert werden.

§8.5 / 5:

  

Um value-initialize bedeutet ein Objekt vom Typ T :

     
  • Wenn T ein Klassentyp mit einem deklarierten Konstruktor ist, dann wird der Standardkonstruktor für T aufgerufen (und die Initialisierung ist fehlerhaft, wenn T keinen zugreifbaren Standardkonstruktor hat);
  •   
  • Wenn T ein Nicht-Union-Klassentyp ohne einen von einem Benutzer deklarierten Konstruktor ist, wird jeder nicht statische Datenmember und die Basisklassenkomponente von T value-initialisiert;
  •   
  • Wenn T ein Array-Typ ist, wird jedes Element initialisiert;
  •   
  • andernfalls wird das Objekt nullinitialisiert
  •   

Um Nullinitialisierung bedeutet ein Objekt vom Typ T :

     
  • Wenn T ein Skalartyp ist, wird das Objekt auf den Wert von 0 (null) gesetzt, konvertiert in T ;
  •   
  • Wenn T ein Nicht-Union-Klassentyp ist, wird jedes nicht statische Datenelement und jedes Basisklassen-Unterobjekt auf Null initialisiert;
  •   
  • wenn T ein Union-Typ ist, das erste benannte Datenelement des Objekts, ist null-initialisiert;
  •   
  • Wenn T ein Array-Typ ist, wird jedes Element auf Null initialisiert;
  •   
  • Wenn T ein Referenztyp ist, wird keine Initialisierung durchgeführt.
  •   
    
ildjarn 08.06.2011 20:15
quelle
-2

Warum nicht

verwenden? %Vor%

?

Aber Sie würden trotzdem auf das Problem stoßen, dass z auf einen unvorhersagbaren Wert initialisiert wird. Daher ist es besser, einen Konstruktor zu definieren, der alle Variablen auf genau definierte Werte setzt.

    
Andre Holzner 08.06.2011 20:08
quelle