2016-09-01 9 views
0

Ich bin mit einem C-Stil Struktur, die keinen Konstruktor hat, wie folgt aus:Wie initialisiert man die Struktur in C++?

struct structName { 
    int mem1; 
    int mem2; 
    char mem3; 
    char mem4; 
} 

Ich bin eine Variable dieser Struktur zu schaffen, und ich möchte alle Mitglieder der Struktur auf Null initialisieren. Ich habe die folgenden Methoden gefunden.

  1. struct structName structVar = {}; 
    
  2. struct structName structVar = {0}; 
    
  3. struct structName structVar = struct structName(); 
    

Für die ersten beiden Methoden, mein Compiler "missing Initialisierer für Mitglied" Warnung gibt.

Der dritte Ansatz kompiliert ohne Warnungen.

  • Ist es eine gültige C++ - Anweisung?
  • Fehle ich eine echte Warnung/Fehler mit Methode 3?
  • Gibt es eine bessere alternative Methode, abgesehen von memset()?

    structName structVar{}; 
    structName structVar = {}; 
    auto structName = structVar{}; 
    

    gibt es feine Unterschiede, aber nicht für Aggregate wie in Ihrem Beispiel

    Dies hat den zusätzlichen Vorteil, dass es structVar initialisiert für:

+2

@ 101010 Nein, nicht unbedingt. 'struct foo {foo() = Standard; foo (int) {}}; '. – juanchopanza

+0

Und wie sieht Ihre Struktur aus? Hat es Konstruktoren? Destruktoren? –

+2

In C++ müssen Sie überhaupt nicht "struct" schreiben, also frage ich mich, welche Ressource Sie gefunden haben, als Sie "im Internet" gesucht haben. Lieber C++ aus einem guten Buch lernen ... –

Antwort

1

sollte die bevorzugte Methode einer der folgenden sein beliebiger Typ von structName oder wenn es keine Initialisierung durchführen kann, macht es das Programm schlecht formatiert (der Code kompiliert nicht) (plus es erlaubt keine Verengung)).

In Ihrer spezifischen Beispiel ist ein structName Agregate:

C++14 draft standard:

§8.5.1 Aggregates [dcl.init.aggr]

(1) ein Aggregat ist, ein Array oder eine Klasse (Klausel 9) ohne von Benutzern bereitgestellte Konstruktoren (12.1), keine privaten oder geschützten nicht statischen Datenelemente (Klausel 11), keine Basisklassen (Klausel 10) und keine virtuellen Funktionen (10.3)

Die Initialisierung Syntax I verwendet wird List-Initialisierung genannt:

§8.5.4 List-Initialisierung [dcl.init.list]

(1) List-Initialisierung Initialisierung eines Objekts oder einer Referenz aus einer stained-init-Liste. [...] Eine Initialisierungsliste ist möglicherweise leer. [...

]

Für unser Aggregat bedeutet dies:

§8.5.1 Aggregates [dcl.init.aggr]

(2) Wenn ein Aggregat durch eine Initialisierungsliste initialisiert wird, wie In 8.5.4 angegeben, werden die Elemente der Initialisierungsliste als Initialisierer für die Mitglieder des Aggregats in aufsteigendem Index oder Mitgliedsreihenfolge verwendet. Jedes Mitglied ist kopier initialisiert vom entsprechend initializer-Klausel

(7) Wenn weniger Initialisierer-Klauseln in der Liste enthalten sind, als es Mitglieder im Aggregate, dann jedes Mitglied nicht explizit initialisiert wird von initialisiert werden sein brace-or-equal-initializer oder, wenn kein brace-or-equal-initializer ist, aus einer leeren Initialisierungsliste (8.5.4).

[Beispiel:

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

initialisiert ss.a mit 1, ss.b mit "asdf", ss.c mit dem Wert eines Expression des int Form {} (das heißt, 0) und ss.d mit dem Wert von ss.b [ss.a] (das heißt, 's')

[...]

Ende Beispiel]

Also alle diese gültig sind und tun genau dasselbe:

structName structVar = {}; 
structName structVar = {0}; 
structName structVar = {0, 0}; 

Allerdings, wenn es mindestens einen initializer-clauses und weniger ist, als es Mitglieder in der Summe sind, gcc und clang eine Warnung abgeben. Es könnte sein, dass Sie alle Mitglieder initialisieren wollten, aber einige verpasst haben. Daher ist die leere Initialisierungsliste die sicherste Wahl.


Als Randnotiz struct ist nicht in einer Erklärung benötigt und verwendet allgemein nicht. So ersetzen Sie diese:

struct structName structVar 

mit:

structName structVar 
Verwandte Themen