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