Direktinitialisierung vs Direktlisteninitialisierung (C ++)

8

DIRECT- VS COPY-INITIALISIERUNG
Durch diese Frage ( Ist es direkt-Initialisierung oder Kopier-Initialisierung? ) Ich habe die Unterschiede zwischen direct-initialization und copy-initialization gelernt:

%Vor%

Ich erwähne es hier der Vollständigkeit halber. Meine aktuellen Fragen für diese Seite sind im nächsten Abschnitt & gt; & gt;

aufgeführt


DIREKTINITIALISIERUNG VS DIREKTLISTENINITIALISIERUNG
Die Antworten zeigten, dass man innerhalb der Kategorie der Direktinitialisierung zwischen direct-initialization und direct-list-initialization unterscheiden kann.:

%Vor%

Ich weiß, dass die list-Initialisierung keine Einengungen erlaubt, so dass eine Initialisierung wie int x{3.5}; nicht kompiliert wird. Aber außerdem habe ich ein paar Fragen:


(1) Gibt es Unterschiede in der Compilerausgabe zwischen
obj s("value"); und obj s{"value"}; ?
Betrachten wir einen Compiler ohne irgendwelche Optimierungen. Ich würde gerne einen möglichen technischen Unterschied wissen: -)


(2) Vielleicht sollte ich genau die gleiche Frage für eine Multi-Variablen-Initialisierung stellen, wie zum Beispiel:
obj s("val1", "val2"); und obj s{"val1", "val2"};


(3) Ich habe bemerkt, dass die Initialisierung der Liste manchmal einen anderen Konstruktor aufrufen kann, wie in:

%Vor%

Wie ist das möglich?

Haben wir hier alle möglichen Initialisierungen?
Aus meinen begrenzten Kenntnissen über C ++ glaube ich, dass alle möglichen Initialisierungen von Objekten (entweder native oder benutzerdefinierte typisierte Objekte) in den obigen Beispielen behandelt wurden. Ist das korrekt? Habe ich etwas übersehen?

PS: Ich lerne C ++ (ich kenne C, aber noch nicht C ++), also sei bitte nicht zu hart für mich; -)

    
K.Mulier 18.11.2017, 13:08
quelle

2 Antworten

7
  


(1) Gibt es einen Unterschied in der Compilerausgabe zwischen
obj s("value"); und obj s{"value"}; ?
Betrachten wir einen Compiler   ohne irgendwelche Optimierungen. Ich würde gerne jede mögliche technische wissen   Unterschied: -)

     


(2) Vielleicht sollte ich genau die gleiche Frage für a stellen   Initialisierung mehrerer Variablen, wie:
obj s("val1", "val2"); und    obj s{"val1", "val2"};

     


(3) Ich habe festgestellt, dass die Initialisierung der Liste kann   manchmal rufen Sie einen anderen Konstruktor auf, wie in:

%Vor%      

Wie ist das möglich?

  • Wenn es einen Initialisierungslisten-Konstruktor gibt der Klassentyp obj , wird immer in -initialisierungsinitialisierer ( list initialization ) bevorzugt Fall obj s{"value"}; ;

    Dies bedeutet, dass wenn Sie einen Konstruktor haben, der std::initializer_list<T> als ersten Parameter verwendet und andere Parameter als Standardwerte verwendet werden, dann wird dies bevorzugt. Beispiel

    %Vor%

    std::vector<T> und andere STL-Container haben solche Initialisierungslisten-Konstruktoren .

  • Andernfalls tritt die Überladungsauflösung ein und sie greift auf einen verfügbaren Konstruktor zurück, der ausgewählt wurde durch den Überladungsauflösungsprozess;

  • Andernfalls, wenn die Klasse keine benutzerdefinierten Konstruktoren hat und es sich um einen Aggregattyp handelt, initialisiert sie die Klassenmitglieder direkt.

  

Haben wir hier alle möglichen Initialisierungen?
Von meinem   begrenztes Wissen über C ++, glaube ich, dass alle möglichen Initialisierungen   von Objekten (entweder native oder benutzerdefinierte typisierte Objekte) haben   in den obigen Beispielen behandelt worden. Ist das korrekt? Habe ich übersehen   etwas?

Nein. Du hast es nicht getan. Mit Ausnahme von Referenzinitialisierung gibt es fünf Möglichkeiten, wie Objekte in C ++ initialisiert werden können.

  • Direkte Initialisierung
  • Listeninitialisierung
  • Kopierinitialisierung
  • Wert Initialisierung
  • Aggregationsinitialisierung (nur für Aggregattypen)

Hier finden Sie weitere Informationen

    
WhiZTiM 18.11.2017 13:17
quelle
3

Liste-Initialisierung garantiert von links nach rechts Reihenfolge der Argumente Auswertung. In diesem Beispiel erstellen wir std::tuple von istream data und geben dann das Tupel Beispiel hier aus:

%Vor%

Ausgabe:

%Vor%

Wie Sie sehen können, wird der Unterschied gesehen, dann verwenden wir mehrmals dieselbe stream-ähnliche Ressource innerhalb von Funktionskrallen.

Auch meine Frage dazu

    
Semyon Burov 18.11.2017 15:08
quelle

Tags und Links