Storia della questione:
Nelle versioni precedenti di C++, tutti i membri della classe dovevano essere inizializzati o nella lista di inizializzazione del costruttore, o nel corpo del costruttore. Con l'introduzione di C++11, è diventata possibile l'inizializzazione dei membri non statici della classe direttamente nel punto in cui sono definiti, migliorando notevolmente la leggibilità e riducendo la probabilità di errori con variabili non inizializzate.
Problema:
L'assenza di inizializzazione per default portava a comportamenti poco chiari per gli sviluppatori, specialmente con l'introduzione di nuovi costruttori. Non c'era garanzia che i membri della classe fossero sempre inizializzati. La bellezza e la novità dell'approccio risiedono nella riduzione del codice boilerplate.
Soluzione:
L'inizializzazione inline stabilisce un valore predefinito per un membro della classe, se non è stato esplicitamente inizializzato nella lista di inizializzazione del costruttore.
Esempio di codice:
class Widget { int value = 42; std::string name{"default"}; public: Widget() {} Widget(int v) : value(v) {} };
Caratteristiche chiave:
Sarà utilizzato il valore dall'inizializzazione inline se il membro è specificato nella lista di inizializzazione del costruttore?
No, sarà usato il valore dalla lista di inizializzazione del costruttore. Esempio:
class Test { int a = 10; public: Test(int x) : a(x) {} }; Test t(42); // a == 42
È possibile inizializzare inline i membri statici della classe?
No, solo i membri non statici. I membri statici della classe vengono inizializzati separatamente al di fuori della classe.
È possibile utilizzare espressioni per l'inizializzazione inline dei membri della classe?
Per membri semplici — sì (ad esempio, chiamando un costruttore o usando un letterale). Per calcoli complessi, utilizzare una funzione o l'inizializzazione nel costruttore.
Il team ha aggiunto un nuovo costruttore, ma ha dimenticato di inizializzare un campo. È rimasto con un valore non inizializzato. Si verificava un crash durante l'accesso alla variabile.
Vantaggi:
Svantaggi:
L'inizializzazione inline è stata applicata a tutti i campi della classe. Nei nuovi costruttori non è stato necessario scrivere esplicitamente l'inizializzazione, riducendo la quantità di codice boilerplate e di errori.
Vantaggi:
Svantaggi: