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 name
membro è inizializzato il std::string
costruttore che richiede due iteratori di ingresso , il rname
membro viene inizializzato con un riferimento name
, il crname
membro è inizializzato con un const riferimento name
, e l' age
elemento 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 Example
possono 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 è name
stato 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.