2016-11-25 1 views
1

In C++ 11, haben wir zwei Möglichkeiten, die Datenelemente einer Klasse/Struktur zu initialisieren, wie in den folgenden Beispielen erläutert:Wie Sie die Datenelemente in C++ 11 ordnungsgemäß initialisieren?

struct A 
{ 
    int n = 7; 
}; 

struct B 
{ 
    int n; 

    B() : n(7) {} 
}; 

Frage 1:

Welcher Weg ist besser?

Frage 2:

Ist die traditionelle Art und Weise (letztere) nicht aus der Sicht eines modernen-C ermutigt ++ - Stil-Checker?

Antwort

3

Sie können tatsächlich mischen beide Stile. Dies ist nützlich, wenn Sie mehrere Konstruktoren haben, aber die Variablen nur von einem oder einigen der Konstruktoren speziell initialisiert werden.

Beispiel

struct A 
{ 
    int n = 7; 

    A() {} // n will be initialized to 7 
    A(int n_): n{n_} {} // Initialize n to something else 
}; 
+0

Ich bin mir nicht sicher, ob das n {n_} ein Fehler ist oder nicht? Ist es möglich, auch im Konstruktor die Initialisierungsnotation zu verwenden? – holmicz

+1

@ OndřejHolman Seit C++ 11 ist es gültig. –

+0

noch eine Sache, wenn Initializer-Liste verwenden kann einige Overhead verursachen, wenn ich richtig bin. Ich würde es vermeiden, wenn Sie mit begrenzten Ressourcen umgehen müssen. – holmicz

2

Ich bin mir nicht sicher, aber ich denke, dass der erste Fall nur mit C++ primitiven Typen möglich ist. In den meisten Büchern, vor allem in Buch 55 Wege, um Ihren C++ Code von Scott Meyers zu verbessern, wird empfohlen, über den ersten Weg zu gehen, also würde ich dabei bleiben. :-)

Vergessen Sie nicht, dass Reihenfolge der Auswertung und Initialisierung festgelegt wird, wie Mitglieder in Klassen sortiert werden.

Ich bevorzuge nur die zweite Art der Initialisierung.

+0

Dieses Buch wurde im Jahr 2005 geschrieben, was 6 Jahre vor 2011 ist. Daher kennt der Autor die neue Initialisierungsmethode nicht. – ymonad

+0

Nun, sie haben eine neue Ausgabe gemacht. Ich sage nicht, es ist 100% genau, aber einige C++ 11 Elemente sind da, 14 fehlt komplett. :-) Obwohl es alt ist, sind viele Konzepte immer noch gültig. – holmicz

+0

Hoppla, das weiß ich nicht. und habe deine Antwort komplett verpasst. vergib mir. – ymonad

0

Weder Weg ist besser, jedoch hat die neue einheitliche Initialisierung die Vergünstigung von anderen Sprachen und über-all verständlichen ähnlich zu sein. Die einheitliche Initialisierung gilt nicht nur für Strukturelemente, sondern auch für Initialisierungslisten und Konstruktorargumente.

Verwandte Themen