Prima di tutto, lasciami spiegare cos'è un elenco di inizializzatori di mem . Un elenco di inizializzatori mem è un elenco separato da virgole di inizializzatori mem , in cui ogni inizializzatore mem è un nome membro seguito da (, seguito da un elenco espressioni , seguito da un ). L' elenco di espressioni è il modo in cui il membro è costruito. Ad esempio, in
static const char s_str[] = "bodacydo";
class Example
{
private:
int *ptr;
string name;
string *pname;
string &rname;
const string &crname;
int age;
public:
Example()
: name(s_str, s_str + 8), rname(name), crname(name), age(-4)
{
}
};
l' elenco mem-inizializzatore del costruttore fornito dall'utente, senza argomenti name(s_str, s_str + 8), rname(name), crname(name), age(-4). Questo mem-inizializzazione-list significa che il namemembro è inizializzato il std::stringcostruttore che richiede due iteratori di ingresso , il rnamemembro viene inizializzato con un riferimento name, il crnamemembro è inizializzato con un const riferimento name, e l' ageelemento viene inizializzato con il valore -4.
Ogni costruttore ha il proprio elenco di inizializzatori mem e i membri possono essere inizializzati solo in un ordine prestabilito (sostanzialmente l'ordine in cui i membri sono dichiarati nella classe). Così, i membri Examplepossono essere inizializzate solo nell'ordine: ptr, name, pname, rname, crname, e age.
Quando non si specifica un inizializzatore mem di un membro, lo standard C ++ dice:
Se l'entità è un membro di dati non statico ... di tipo di classe ..., l'entità è inizializzata per impostazione predefinita (8.5). ... Altrimenti, l'entità non è inizializzata.
Qui, poiché nameè un membro di dati non statico del tipo di classe, viene inizializzato per impostazione predefinita se nell'elenco inizializzatore mem non è namestato specificato alcun inizializzatore per . Tutti gli altri membri di non hanno tipo di classe, quindi non sono inizializzati.Example
Quando lo standard dice che non sono inizializzati, ciò significa che possono avere qualsiasi valore. Pertanto, poiché il codice sopra riportato non è stato inizializzato pname, potrebbe essere qualsiasi cosa.
Nota che devi ancora seguire altre regole, come la regola che i riferimenti devono sempre essere inizializzati. È un errore del compilatore non inizializzare i riferimenti.