C ++ - Reihenfolge der Elementinitialisierung und Inkrementierung

8

Ich habe nach einigen Tests gesucht, um mein C ++ - Wissen zu verbessern. Hier ist eine der Übungen: Was ist die Ausgabe des folgenden Programms?

%Vor%

Nun, ich habe diesen Code ausprobiert, und die Antwort lautet 02002 . Ich komme hierher, um eine Erklärung zu haben, weil ich nicht verstehe, warum 02002 das Ergebnis ist. Ich werde meine Argumentation erklären, aber könnten mir einige sagen, wo liege ich falsch?

Lassen Sie uns "str" ​​die aktuelle zu druckende Zeichenfolge nennen. Wenn das Objekt b erstellt wird:

  1. Der Konstruktor von A wird aufgerufen. str = & gt; 0 , m_i = & gt; %Code%
  2. Konstruktion von 1 . str = & gt; %Code%
  3. Konstruktion von m_a(new A[2]) . str = & gt; 000 , m_x(++m_i) = & gt; %Code%
  4. Letzte Aktualisierung von str (in 0002 's Konstruktor) = & gt; str = & gt; %Code%

Hier sind meine Fragen:

  • Warum ist der endgültige Wert von m_i 3 und nicht B ?
  • Warum wird 00023 vor dem m_i erstellt? Ich habe versucht, die Position der Initialisierung von m_x und m_a auszutauschen und die Antwort ist immer noch die gleiche: 2 .
Ptiseb 23.12.2015, 16:15
quelle

2 Antworten

12
  

Warum ist der Endwert von m_i 2 und nicht 3 ?

Weil new A[2] zwei separate Instanzen erstellt, die nichts mit *this zu tun haben. m_i der b -Instanz wird nur in A::A und B::B (zweimal) erhöht.

Wenn die Inkrementierung von m_i für dieselbe Instanz ausgeführt werden soll (z. B. m_i ist eine Referenz), wäre es vernünftiger zu denken, dass der endgültige Wert von m_i % co_de sein sollte % (es gibt zwei Objekte im Array - zwei zusätzliche Inkremente).

  

Warum wird die Konstruktion von 4 vor der von m_x(++m_i) erstellt?

Weil die Reihenfolge der Initialisierung von der Reihenfolge der Deklaration der Datenmitglieder abhängt , nicht die Reihenfolge, in der Sie Initialisierungen in die Memberinitialisierungsliste schreiben.

    
LogicStuff 23.12.2015, 16:20
quelle
4

Wenn Sie b erstellen, wird zuerst der A -Teil von B erstellt. Dies gibt 0 in der Ausgabe an. Dann erhalten wir das 2 , weil m_x(++m_i) zuerst passiert, da m_x zuerst in der Klasse aufgeführt ist. Seit m_i ist 1 von A Teil von B wird konstruiert ++m_i gibt 2 und jetzt haben wir 02 . Dann wird m_a(new A[2]) ran, was uns 2 0 (eins für jedes Mitglied des Arrays) gibt. Das bringt uns zu 0200 . Wir erhalten dann das letzte 2 von { std::cout << m_i; } , da m_i immer noch 2 von m_x(++m_i) ist.

    
NathanOliver 23.12.2015 16:22
quelle

Tags und Links