Nelle prime versioni di C++, i membri della classe venivano inizializzati all'interno del costruttore tramite assegnazione. In seguito, è stata introdotta la possibilità di inizializzare i membri della classe prima di entrare nel corpo del costruttore utilizzando la lista di inizializzazione, che è critica per i membri costanti, i riferimenti e le prestazioni.
Alcuni membri della classe (ad esempio, campi const o riferimenti) non possono essere inizializzati mediante assegnazione all'interno del corpo del costruttore — devono essere definiti al momento della creazione. Inoltre, se si utilizza l'assegnazione, il costruttore predefinito verrà chiamato prima e poi seguirà l'assegnazione (due operazioni), il che può essere costoso per oggetti complessi:
class Example { const int x; std::string str; public: Example(int val, const std::string& s) : x(val), str(s) {} };
Utilizzare la lista di inizializzazione per inizializzare immediatamente i membri della classe. Questo è particolarmente importante per const, riferimenti, classi membri senza costruttore predefinito e per le prestazioni quando si lavora con classi STL e grandi strutture.
Esempio di codice:
class Point { const int x; int& y; public: Point(int val, int& ref) : x(val), y(ref) {} };
Caratteristiche chiave:
È possibile cambiare l'ordine di inizializzazione dei membri della classe attraverso l'ordine nella lista di inizializzazione del costruttore?
No! I membri vengono sempre inizializzati nell'ordine in cui sono dichiarati nella classe, non in base all'ordine nella lista di inizializzazione. Ignorare questa regola porta a errori nell'ordine di inizializzazione.
Cosa succede se un membro di riferimento non è inizializzato nella lista di inizializzazione, ma solo nel corpo del costruttore?
Errore di compilazione! I riferimenti, così come i campi const, possono essere inizializzati solo nella lista di inizializzazione — devono ricevere un valore prima di entrare nel corpo del costruttore.
Dopo aver inizializzato un membro const nella lista di inizializzazione, è possibile cambiarlo nel corpo del costruttore?
No, un membro costante non può essere modificato dopo l'inizializzazione — tentare di modificare un campo del genere porterà a un errore di compilazione.
Nel costruttore, un membro della classe viene inizializzato all'interno del corpo del costruttore. Per oggetti complessi, vengono spesi risorse per chiamare il costruttore predefinito, poi per l'assegnazione, e infine per la distruzione dell'oggetto temporaneo.
Pro:
Contro:
Tutti i membri vengono inizializzati immediatamente nella lista di inizializzazione, senza operazioni superflue e problemi con i campi immutabili.
Pro:
Contro: