C'è una sottile ma importante differenza tra queste due opzioni. Quello che hai in cima è chiamato un elenco di inizializzazione dei membri. Quando l'oggetto viene creato, i membri in questo elenco vengono inizializzati in base a ciò che inserisci tra parentesi.
Quando si esegue assegnazione nel corpo del costruttore, i valori vengono prima inizializzato, e quindi assegnato. Pubblicherò un breve esempio qui sotto.
Esempio 1: inizializzazione Stati
class foo
{
public:
foo(char c, int i);
private:
char exampleChar;
int exampleInt;
Bar exampleBar;
};
foo::foo(char c, int i):
exampleChar(c),
exampleInt(i),
exampleBar() //Here, a bar is being default constructed
{
}
Esempio 2: Constructor Assegnazione
class foo
{
public:
foo(char c, int i, Bar b);
private:
char exampleChar;
int exampleInt;
Bar exampleBar;
};
foo::foo(char c, int i, Bar b):
//exampleChar(c),
//exampleInt(i),
//exampleBar()
{
exampleChar = c;
exampleInt = i;
exampleBar = someOtherBar; //Here, a bar is being assigned
}
Questo è dove si fa interessante. Notare che exampleBar
si assegna. Dietro le quinte, un Bar
viene effettivamente creato per primo, anche se non lo hai specificato. Inoltre, se il tuo Bar
è più complicato di una semplice struttura, dovrai essere sicuro di implementare l'operatore di assegnazione in modo che tu possa inizializzarlo in questo modo. Inoltre, per inizializzare lo Bar
da un altro Bar
dall'elenco di inizializzazione dei membri, è necessario implementare il costruttore di copie!
Esempio 3: Copia costruttore utilizzati negli Stati init
class foo
{
public:
foo(char c, int i, Bar b);
private:
char exampleChar;
int exampleInt;
Bar exampleBar;
};
foo::foo(char c, int i, Bar b):
//exampleChar(c),
//exampleInt(i),
exampleBar(b) //Here, a bar is being constructed using the copy constructor of Bar
{
exampleChar = c;
exampleInt = i;
}
"Questo codice ... non segue le regole a cui sono abituato in altre lingue" Bene, il C++ non è una di quelle altre lingue. Ci sono molte cose in C++ che sono differenti rispetto a "altre lingue" (e, probabilmente, ci sono molte cose in ognuna delle altre lingue che sono diverse dalle altre di quelle altre lingue). –
domande molto simili: http://stackoverflow.com/questions/1598967/benefits-of-initialization-lists, http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member -initialization-list, http://stackoverflow.com/questions/4589237/c-initialization-lists, e probabilmente molto altro ancora –