Stavo cercando alcuni test per migliorare le mie conoscenze in C++. Ecco uno degli esercizi: Qual è l'output del seguente programma?C++ - ordine di inizializzazione e di incremento dei membri
#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;
}
Beh, ho provato questo codice, e la risposta è 02002
. Vengo qui per avere qualche spiegazione perché non capisco perché il risultato sia 02002
. Spiegherò il mio ragionamento, ma alcuni potrebbero dirmi dove sbaglio, per favore?
Chiamiamo "str" la stringa corrente da stampare. Quando l'oggetto b
viene creato:
- Viene chiamato il costruttore di
A
. str =>0
,m_i
=>1
- Costruzione di
m_a(new A[2])
. str =>000
- Costruzione di
m_x(++m_i)
. str =>0002
,m_i
=>3
- Ultimo aggiornamento str (nel costruttore
B
s') => str =>00023
Ecco le mie domande:
- Perché il valore finale di
m_i
2
e non3
? - Perché la costruzione di
m_x(++m_i)
è stata preceduta da quella dim_a(new A[2])
? Ho provato a scambiare la posizione dell'inizializzazione di m_x e m_a e la risposta è sempre la stessa:02002
.
Poiché 'm_x' è dichiarato * prima *' m_a' nella classe 'B',' B (int n = 5): m_a (nuovo A [2]), m_x (++ m_i) 'è ill- formato e dovrebbe essere 'B (int n = 5): m_x (++ m_i), m_a (nuovo A [2])'. – YSC
@YSC è corretto, almeno, riceverai un sacco di avvertimenti quando compili con gcc (non sono sicuro degli altri) – Danh
@YSC 'B (int n = 5): m_a (nuovo A [2]) , m_x (++ m_i) 'non è mal formato. Forse dovrebbe essere reso mal formato, ma sfortunatamente non lo è. – cpplearner