2010-11-26 16 views
3

Wenn ich eine Klasse mit Standardkonstruktor deklariere und eine Instanz dieser Klasse mit Initialisierungsliste wie folgt definiere, wird der Standardkonstruktor für diese Definition aufgerufen? Und warum wurde gerufen oder nicht gerufen?Unterschreibt Initialisiererliste den Aufruf von Konstruktor?

class Sample 
{ 
// this should be any aggregate type in c++ 
}; 

int main() 
{ 
    Sample s = {0}; 
    return 0; 
} 

Antwort

1

The Standard sagt ($ 8,5/14)

die Semantik initializers sind wie folgt. Der Zieltyp ist der Typ des Objekts oder der Referenz, die initialisiert werden, und der Quelltyp ist der Typ des Initialisierungsausdrucks. Der Quellentyp ist nicht definiert, wenn der Initialisierer geschweifte Klammern enthält oder wenn es sich um eine Liste von Ausdrücken in Klammern handelt. Wenn der Zieltyp ein (möglicherweise cv-qualifizierter) Klassentyp ist: - Wenn die Klasse ein Aggregat (8.5.1) ist und der Initialisierer eine geschweifte Klammer ist, siehe 8.5.1. .

.

8.5.1/13

[Hinweis: Ein Aggregat-Array oder ein Aggregat Klasse können Mitglieder eines Klassentyps mit einem vom Benutzer angegebenen Konstruktor (12.1) enthalten. Die Initialisierung dieser Aggregatobjekte wird in 12.6.1 beschrieben.

]

Auch 12.6.1/2 sagt

Wenn ein Aggregat (ob Klassen- oder Array) Mitglieder des Klassentypen enthält und durch eine geschweifte Klammer umschlossene Initialisierer-list (8.5.1) initialisiert wird jedes derartige Element durch den entsprechenden Zuweisungsausdruck kopieninitialisiert (siehe 8.5). Wenn in der Initialisierungsliste weniger Initialisierer als Mitglieder des Aggregats vorhanden sind, wird jedes nicht explizit initialisierte Element initialisiert (8.5), das heißt .

+1

ähm, das ist kein Skalar ... ;-) spät? –

+1

@Alf: Ja Adobe Acrobat saugt: P –

+1

Siehe auch 12.6.1/2. –

1

In C++ Sie nur POD initialisieren kann (einfache alte Daten) mit = {0} (zumindest vor C++ 0x). Daher wird der Standardkonstruktor nicht aufgerufen, da dies nicht kompiliert wird.

+0

Nicht wahr. POD ist restriktiver als Aggregat. Zum Beispiel kann eine Klasse mit einem vom Benutzer deklarierten Destruktor mit einem geschweiften Initialisierer initialisiert werden. –

+1

Nur das Sichern von @Charles, z.B. Ein roher Array von 'std :: string' kann mit geschweiften Klammern initialisiert werden. Das OP sagt sehr genau * Aggregat *. Das ist ein Begriff, der durch den heiligen Standard definiert wird: Aggregate können mit geschweifter Klammernotation initialisiert werden. –

3

Wenn Sie einen in Klammern eingeschlossenen Initialisierer angeben, werden alle Member der Klasse aus dem entsprechenden Ausdruck des mit Klammern versehenen Initialisierers copy-initialisiert.

Eine solche Initialisierung ist nur für Aggregate gültig, die keine Konstruktoren haben, die vom Benutzer deklariert werden, so dass die Unterdrückung des vom Compiler erzeugten Konstruktors fast akademisch ist.

5
  • In C++ 03, nur aggregate classes mit geschweiften Klammern, und ein Aggregat Klasse haben keinen Benutzer definiert Konstruktor
  • In C++ 0x, diese Syntax für nicht Aggregattypen initialisiert werden durch unterstützt wird initializer lists und ruft den entsprechenden Konstruktor
  • (eine std::initializer_list nehmen)
Verwandte Themen