2015-10-17 10 views
8

I this link von Stroustrup mit dem folgenden Code zu lesen:Delegieren Bauer in C++() oder {}

class X { 
     int a; 
    public: 
     X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); } 
     X() :X{42} { } 
     X(string s) :X{lexical_cast<int>(s)} { } 
     // ... 
    }; 

Meine Frage nach der Linie ist:

X() X{42}{}

Gibt es irgendwelche Unterschiede zwischen Klammern und geschweifte Klammern?
Wenn es keine Unterschiede gibt, kann ich geschweifte Klammern auch in anderen Funktionsaufrufen verwenden? Oder ist es nur in der Konstruktordelegierung? Und schließlich Warum sollten wir beide Syntaxen haben? Es ist ein wenig ambig.

+1

"kann ich geschweifte Klammern auch in anderen Funktionen verwenden oder ist es nur in der Delegierung von Konstruktoren?" - Die Konstruktordelegation ist kein Funktionsaufruf. Sie können niemals '{}' mit Funktionsaufrufen verwenden. – emlai

+0

check this: http://stackoverflow.com/questions/18222926/why-is-list-initialization-using-curly-brazes-better-than-the-alternatives –

Antwort

7

() verwendet value initialization, wenn die Klammern leer sind, oder direct initialization wenn nicht leer.

{}list initialization verwendet, die value initialization impliziert, wenn die Zahnspange leer sind, oder wenn die aggregate initialization initialisiert Objekt ein Aggregat ist.

Da Ihr X ist ein einfaches int, da zwischen der Initialisierung mit () oder {} kein Unterschied.

+0

Wenn ich richtig verstehe, bedeutet es, wenn ich 'X wrinting bin(): X (42) {} 'dann rufe ich den Konstruktor intege auf, aber wenn ich' X(): X {42} {} 'schreibe, initialisiere ich Memebr-Variablen, ohne einen anderen Konstruktor aufzurufen? – Govan

+0

@Govan - primitive Typen wie 'int' und' double' sind keine vollwertigen Objekte. Sie haben keine Konstruktoren. –

+0

@DavidHammen Ich meinte X (int Konstruktor) nicht primitiv int Konstruktor – Govan

0

Initialisierungswerte können in Klammern oder geschweiften Klammern angegeben werden.

Die Klammerinitialisierung wurde mit C++ 11 eingeführt und soll eine "einheitliche Initialisierung" sein, die für alle nicht statischen Variablen verwendet werden kann.

Klammern können anstelle von Klammern oder Gleichheitszeichen verwendet werden und wurden eingeführt, um die Einheitlichkeit zu erhöhen und die Verwirrung zu reduzieren.

Es ist nur ein syntaktisches Konstrukt und führt nicht zu Leistungsvorteilen oder Strafen.