In C++, l'ordine di inizializzazione dei membri della classe avviene sempre nell'ordine in cui sono dichiarati nel corpo della classe, e non nell'ordine in cui sono specificati nella lista di inizializzazione del costruttore.
Esempio:
struct Foo { int a; int b; Foo() : b(2), a(b) {} };
In questo esempio, a verrà inizializzato per primo con il valore della variabile b, che è indefinito, perché prima viene inizializzato a, poi b, indipendentemente dall'ordine nella lista di inizializzazione. Di conseguenza, a non sarà uguale a 2.
Il modo corretto: durante l'inizializzazione, fare riferimento solo ai membri già dichiarati sopra o utilizzare costanti.
Qual è l'ordine di inizializzazione dei membri della classe se nella lista di inizializzazione del costruttore l'ordine di inizializzazione è diverso da quello della dichiarazione?
Risposta: Viene sempre inizializzato per primo il membro che è stato dichiarato per primo nella classe, indipendentemente dall'ordine nella lista di inizializzazione del costruttore. Ciò può portare a errori in caso di dipendenze reciproche tra i membri della classe.
Storia
In una classe complessa, durante l'inizializzazione di un riferimento a un membro della classe, un altro membro non era stato inizializzato. Si è scoperto che l'ordine nella lista di inizializzazione non conta, e si è verificato l'uso di memoria non inizializzata. Il software è andato in crash solo con alcuni compilatori e configurazioni.
Storia
Aggiungendo un nuovo membro nel mezzo della classe senza correggere l'ordine di inizializzazione dei membri dipendenti è stata generata un'errore, individuato solo mediante analisi statica del codice. La variabile assumeva un valore non valido a causa del vecchio ordine di dichiarazione.
Storia
Una nuova versione della libreria modificava il codice sorgente della classe e cambiava l'ordine dei membri, senza aggiornare il costruttore. Di conseguenza, i valori nell'applicazione operavano con dati non validi: l'ingegnere non riusciva a capire il motivo per lungo tempo, finché non ha visto il warning del compilatore riguardo all'ordine di inizializzazione.