Auswertungsreihenfolge der Konstruktor-Initialisierungsliste

Lesezeit: 2 Minuten

Auswertungsreihenfolge der Konstruktor Initialisierungsliste
Hakenz

Ich habe einen Konstruktor, der einige Argumente übernimmt. Ich hatte angenommen, dass sie in der aufgeführten Reihenfolge erstellt wurden, aber in einem Fall scheint es, als würden sie in umgekehrter Reihenfolge erstellt, was zu einem Abbruch führte. Als ich die Argumente umkehrte, hörte das Programm auf abzubrechen. Dies ist ein Beispiel für die Syntax, die ich verwende. Die Sache ist, dass a_ in diesem Fall vor b_ initialisiert werden muss. Können Sie die Baureihenfolge garantieren?

z.B

class A
{
  public:
    A(OtherClass o, string x, int y) :
      a_(o), b_(a_, x, y) { }

    OtherClass a_;
    AnotherClass b_;
};

  • Sie sagen, Sie fragen nach Konstruktorargumenten, aber sie werden ausgewertet, bevor Sie den Konstruktor erreichen, und sie werden in einer nicht angegebenen, vom Compiler festgelegten Reihenfolge ausgewertet. Aber Sie fragen wirklich nach der Reihenfolge der Initialisierungslisten, also habe ich den Fragentitel für Sie geändert.

    – Rob Kennedy

    7. August 2009 um 12:45 Uhr

  • Diese Frage wurde mir in einem Interview gestellt 🙂

    – Sunil Kartikey

    19. September 2020 um 5:46 Uhr

  • Der Interviewer hat wahrscheinlich die Frage von hier 🙂

    – Hookenz

    19. September 2020 um 6:57 Uhr

Dies hängt von der Reihenfolge der Member-Variablen-Deklaration in der Klasse ab. Damit a_ wird dann der erste sein b_ wird die zweite in Ihrem Beispiel sein.

  • Tatsächlich warnen gute Compiler, wenn Sie eine andere Reihenfolge in der Deklaration als in der Konstruktor-Initialisierungsliste haben. Siehe zum Beispiel -Wreorder im gcc.

    – Greg Hewgill

    7. August 2009 um 4:17 Uhr

  • Der Grund dafür, dass sie in der Reihenfolge der Elementdeklaration und nicht in der Reihenfolge im Konstruktor erstellt werden, ist, dass man mehrere Konstruktoren haben kann, aber nur einen Destruktor. Und der Destruktor zerstört die Mitglieder in der umgekehrten Reihenfolge der Konstruktion.

    – Ein Programmierer

    7. August 2009 um 6:45 Uhr

  • meinten wir …umgekehrte Deklarationsreihenfolge. Nicht von “Konstruktion”, der Destruktor kann unmöglich in den Konstruktor sehen, um es zu wissen, oder?

    Benutzer337598

    5. November 2018 um 15:09 Uhr

Um die Norm zur Klarstellung zu zitieren:

12.6.2.5

Die Initialisierung erfolgt in der folgenden Reihenfolge:

  • Dann sollen nichtstatische Datenelemente in der Reihenfolge initialisiert werden, in der sie in der Klassendefinition deklariert wurden (wieder unabhängig von der Reihenfolge der Mem-Initialisierer).

Die Standardreferenz dafür erscheint jetzt 12.6.2 Abschnitt 13.3:

(13.3) — Dann werden nicht-statische Datenelemente in der Reihenfolge initialisiert, in der sie in der Klassendefinition deklariert wurden (wieder unabhängig von der Reihenfolge der Mem-Initialisierer).

989390cookie-checkAuswertungsreihenfolge der Konstruktor-Initialisierungsliste

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy