Ich suchte nach einigen Tests, um meine C++ Kenntnisse zu verbessern. Hier ist eine der Übungen: Was ist die Ausgabe des folgenden Programms?C++ - Reihenfolge der Mitglieder Initialisierung und Inkrementierung
#include <iostream>
class A
{
public:
A(int n = 0) : m_i(n)
{
std::cout << m_i;
++m_i;
}
protected:
int m_i;
};
class B : public A
{
public:
B(int n = 5) : m_a(new A[2]), m_x(++m_i) { std::cout << m_i; }
~B() { delete [] m_a; }
private:
A m_x;
A *m_a;
};
int main()
{
B b;
std::cout << std::endl;
return 0;
}
Nun habe ich versucht, diesen Code, und die Antwort ist 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 Zeichenfolge zum Drucken nennen. Wenn das b
Objekt gebaut wird:
- Der Konstruktor von
A
aufgerufen. str =>0
1
m_a(new A[2])
. str =>000
- Konstruktion von
m_x(++m_i)
. str =>0002
,m_i
=>3
- Letzte Aktualisierung von str (in
B
‚s Konstruktor) => str =>00023
Hier sind meine Fragen:
- Warum ist der Endwert von
m_i
2
und nicht3
? - Warum wird der
m_x(++m_i)
vor dem vonm_a(new A[2])
gebaut? Ich habe versucht, die Position der Initialisierung von m_x und m_a auszutauschen und die Antwort ist immer noch die gleiche:02002
.
Da 'm_x' in der' B' Klasse * vor * 'm_a' deklariert ist,' B (int n = 5): m_a (neu A [2]), m_x (++ m_i) 'ist krank- gebildet und sollte 'B (int n = 5) sein: m_x (++ m_i), m_a (neu A [2])'. – YSC
@YSC ist korrekt, zumindest werden Sie eine Menge Warnung bekommen, wenn Sie mit gcc kompilieren (ich bin mir nicht sicher über die anderen) – Danh
@YSC 'B (int n = 5): m_a (neu A [2]) , m_x (++ m_i) 'ist nicht schlecht gebildet. Vielleicht sollte es schlecht gemacht werden, aber leider nicht. – cpplearner