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:
A
wird aufgerufen. str = & gt; 0
, m_i
= & gt; %Code%
1
. str = & gt; %Code%
m_a(new A[2])
. str = & gt; 000
, m_x(++m_i)
= & gt; %Code%
0002
's Konstruktor) = & gt; str = & gt; %Code%
Hier sind meine Fragen:
m_i
3
und nicht B
? 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
. Warum ist der Endwert von
m_i
2
und nicht3
?
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 vonm_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.
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.
Tags und Links class c++ constructor