Di quello che so dei vantaggi dell'utilizzo dell'elenco di inizializzazione è che forniscono efficienza quando si inizializzano i membri della classe che non sono incorporati. Ad esempio,Vantaggi degli elenchi di inizializzazione
Fred::Fred() : x_(whatever) { }
è preferibile,
Fred::Fred() { x_ = whatever; }
se x è un oggetto di una classe personalizzata. Oltre a questo, questo stile è usato anche con tipi built-in per motivi di coerenza.
Il vantaggio più comune di questo è il miglioramento delle prestazioni. Se l'espressione è dello stesso tipo della variabile membro x, il risultato dell'espressione viene costruito direttamente all'interno di x_ - il compilatore non crea una copia separata dell'oggetto.
Con l'altro stile, l'espressione qualsiasi causa la creazione di un oggetto temporaneo separato e questo oggetto temporaneo viene passato nell'operatore di assegnazione dell'oggetto x_. Quindi quell'oggetto temporaneo viene distrutto al; Questo è inefficiente.
Domanda
C'è un guadagno di efficienza nel seguente esempio con l'utilizzo dell'elenco di inizializzazione. Penso che non ci sia alcun guadagno. La prima versione chiama il costruttore di copie della stringa e l'altro chiama l'operatore di assegnazione della stringa (non c'è alcun temporaneo che sia stato creato). È corretto?
class MyClass
{
public:
MyClass(string n):name(n) { }
private:
string name;
};
class MyClass
{
public:
MyClass(string n)
{
name=n;
}
private:
string name;
};
L'altro vantaggio degli elenchi di inizializzazione (se si desidera chiamarlo un vantaggio) è che sono l'unico modo per inizializzare determinate cose: le classi di base utilizzano un ctor non predefinito, i membri const e i membri di riferimento. –
Inoltre, se sei preoccupato per le prestazioni, preferirei usare un 'const &' per passare l'argomento, invece di copiare. –
Come si può avere 'Fred :: Fred(): x_ (qualunque cosa)'? Fred non accetta argomenti. –