C++ - ordine di inizializzazione e incremento dei membri

C++ - ordine di inizializzazione e incremento dei membri


Stavo cercando alcuni test per migliorare la mia conoscenza del C++. Ecco uno degli esercizi:Qual è l'output del seguente programma?


#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;
}

Bene, ho provato questo codice e la risposta è 02002 . Vengo qui per avere qualche spiegazione perché non capisco perché 02002 è il risultato.
Spiegherò il mio ragionamento, ma qualcuno potrebbe dirmi dove sbaglio per favore?


Chiamiamo "str" ​​la stringa corrente da stampare. Quando il b l'oggetto è costruito:



  1. Il costruttore di A è chiamato. str => 0 , m_i => 1

  2. Costruzione di m_a(new A[2]) . str => 000

  3. Costruzione di m_x(++m_i) . str => 0002 , m_i => 3

  4. Ultimo aggiornamento di str (in B 's costruttore) => str => 00023


Ecco le mie domande:



  • Perché il valore finale di m_i 2 e non 3 ?

  • Perché la costruzione di m_x(++m_i) fatto prima di quello di m_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 .


Risposte:



Perché new A[2] crea due istanze separate che non hanno nulla a che fare con *this . m_i del b l'istanza viene incrementata solo in A::A e B::B (due volte).


Se l'incremento di m_i deve essere eseguito sulla stessa istanza (m_i essendo un riferimento, ad esempio), sarebbe più ragionevole pensare che il valore finale di m_i dovrebbe essere 4 (ci sono due oggetti nell'array - due incrementi aggiuntivi).



Poiché l'ordine di inizializzazione dipende dall'ordine di dichiarazione dei membri dati, non dall'ordine in cui scrivi le inizializzazioni nell'elenco degli inizializzatori di membri.