2013-08-15 17 views
6

In C++11 ist es möglich, ein struct einheitliche Initialisierung wie unten zu initialisieren:Wann sollte ich eine einheitliche Initialisierung verwenden?

struct BasicStruct { 
    BasicStruct (int x, double y) : x_{x}, y_{y} {} 

private: 
    int x_; 
    double y_; 
}; 

BasicStruct var1{5, 3.2}; 

Fragen:

  1. Wann soll ich diese Syntax verwende BasicStruct var1{5, 3.2} anstatt den Konstruktor wie BasicStruct var1(5, 3.2) zu nennen?

  2. Wann sollte ich ein Attribut wie x_{x} anstelle der alten Mode Weise x_(x) initialisieren?

+2

Nein, das ist ein "warum" und das ist ein "wann". Ernsthaft Leute. – Potatoswatter

+0

@Potatoswatter http://StackOverflow.com/Questions/1863784/Uniform-Initialization-in-C0x-When-To-use-inste-of-rq=1 etc. – Rapptz

+0

@Rapptz OK, jetzt finden Sie einen mit Antworten, die machen Sinn, oder sind besser als die, die ich hier hinzugefügt habe :) – Potatoswatter

Antwort

4

Verwenden list-Initialisierung, wenn die Liste ist generisch und Sie könnten einen anderen Behälter, wie ein Array, ein Aggregat oder ein vector, ohne ihren Sinn zu ändern viel zu ersetzen.

Wenn Sie eine bestimmte Klasse mit Argumenten für einen bestimmten Konstruktor erstellen, sind altmodische Parens besser geeignet. den Bruchteil einer Gleitkommazahl oder die hohe Bits

Ein einzigartiges Merkmal der Initialisierung mit einer verspannt-init-Liste ist, dass es nicht Verengung Konvertierungen erlaubt, die numerischen Daten verloren beispielsweise wird die dazu führen könnte, von einem long. Dies hilft, Fehler zu markieren (oder zu verhindern), die sich aus der Ersetzung von z.B. ein engerer Array-Typ beim Code-Refactoring.

Ebenso ist der andere Fall, in dem x{ y } geeignet ist, wenn Sie eine numerische Konvertierung durchführen, die nicht verlustreich ist. x(y) wird wirklich versuchen, die Umwandlung zu machen, sogar auf eine reinterpret_cast zurückgreifen, und sollte im Allgemeinen vermieden werden.

Die Terminologie "einheitliche Initialisierung" ist ein bisschen optimistisch, und es erscheint nicht im Standard. Es ist nicht für alle Fälle geeignet. Klammern geben im Allgemeinen Listen an, daher wird sie korrekt als Listeninitialisierung bezeichnet. Und dann sollte es benutzt werden.

Verwandte Themen