2016-03-25 10 views
2

Betrachten Sie das folgende Code-Snippet von pg. 17 von Eine Tour Straustrup von C++:Mitgliedsinitialisierer-Listennotation: Klammern und Klammern

class Vector { 
public: 
    Vector(int s) :elem{new double[s]}, sz{s} { } //construct a Vector 
    double& operator[](int i) { return elem[i]; } //element access: subscripting 
    int size() { return sz; } 
private: 
    double* elem; // pointer to the elements 
    int sz; // the number of elements 
}; 

Hier bin ich besorgt über die Mitglied Initialisiererliste in der dritten Zeile, wo Straustrup einen Doppelpunkt aus den beiden initializer Aussagen seperates elem{new double[s]} und sz{s}.

Frage: Warum verwendet er Klammern (d. H. {..}), um diese beiden Initialisierungsanweisungen zu erstellen? Ich habe anderswo im Internet Leute gesehen, die Initialisierungslisten mit Klammern gemacht haben, so dass dies auch (AFAIK) legal elem(new double[s]) und sz(s) lesen konnte. Gibt es also einen semantischen Unterschied zwischen diesen beiden Notationen? Gibt es andere Möglichkeiten, diese Variablen (im Kontext einer Initialisierungsliste) zu initialisieren?

+0

Die geschweiften Klammern sind neu im C++ 11-Standard und werden für etwas verwendet, das als [* uniform initialization *] bezeichnet wird (https://mbevin.wordpress.com/2012/11/16/uniform-initialization/). . In vielen Fällen gibt es jedoch keinen Unterschied. –

+0

Bedeutet das Initialisieren mit Klammern - also 'sz (s)' und 'elem (new double [s])', dass in beiden Fällen ein Konstruktor aufgerufen wird? – George

+1

Weder 'int' noch' double * 'haben Konstruktoren, also wie könnte ein Konstruktor aufgerufen werden. Es ist einfach * Initialisierung *. Sie würden z.B. 'int sz = 5' um einen Konstruktor aufzurufen? Es macht genau das gleiche wie 'sz (s)' oder 'sz {s}' (wenn 's' 5 war) in Ihrer Initialisierungsliste. –

Antwort

0

Die Form

Vector(int s) :elem(new double[s]), sz(s) { } 

korrekt ist in allen Versionen von C++. Der mit geschweiften Klammern, wie

Vector(int s) :elem{new double[s]}, sz{s} { } 

wurde im Jahr 2011 in die C++ Standard eingeführt und ist in älteren Normen ungültig.

In dem Kontext, nach dem Sie fragen, gibt es keinen Unterschied. Es gibt jedoch auch andere Sprach- und Bibliotheksfunktionen, die ebenfalls in den Standard 2011 eingeführt wurden und auf der zweiten Form basieren und nicht mit der ersten funktionieren.

Es gibt keine anderen Möglichkeiten, Mitglieder von Basen in Initialisierungslisten von Konstruktoren zu initialisieren. Es ist möglich, Mitgliedern im Rumpf von Konstruktoren zuzuweisen, aber das ist keine Initialisierungssyntax.

BTW: Es ist "Stroustrup", nicht "Straustrup". Wenn du Leute zitierst, tu ihnen wenigstens die Höflichkeit, ihre Namen richtig zu machen. Vor allem, wenn Sie es in einem Forum tun, wo ihr Name bekannt ist.

Verwandte Themen