2010-09-02 11 views

risposta

17

No, non significano esattamente la stessa cosa.

Quando un costruttore viene eseguito, prima di immettere il blocco di codice (il codice tra parentesi graffe), costruisce tutti i membri dei dati dell'oggetto. Quello che fai negli inizializzatori (il codice dopo i due punti e prima delle parentesi graffe) serve a specificare quali costruttori usare per quei membri. Se non si specifica un costruttore per un membro dati specifico, verrà utilizzato il costruttore predefinito.

Quindi, se si utilizza l'elenco di inizializzazione (primo esempio), verranno utilizzati i costruttori corretti per ciascun membro e non è necessario alcun codice aggiuntivo. In caso contrario, viene prima utilizzato il costruttore predefinito e quindi viene eseguito il codice all'interno delle parentesi graffe.

In sintesi:

  1. Nel vostro primo esempio, ogni membro viene inizializzato utilizzando il costruttore del caso, probabilmente, il costruttore di copia.
  2. Nel secondo esempio, ciascun membro viene costruito utilizzando il costruttore predefinito e quindi viene eseguito un codice aggiuntivo per inizializzarlo, probabilmente l'operatore di assegnazione.

MODIFICA: Siamo spiacenti, ho dimenticato di rispondere alle vostre domande nell'ultima riga.

Il nome del codice tra i due punti e le parentesi graffe è l'elenco di inizializzazione.

Se si conosce qual è il costruttore corretto per una variabile o un membro dati, utilizzarlo in ogni caso. Questo è il motivo per cui molte classi hanno costruttori diversi invece di un semplice costruttore predefinito. Quindi stai meglio usando l'elenco di inizializzazione.

L'elenco di inizializzazione non è quasi mai più lento rispetto all'altra tecnica e può essere facilmente più veloce. Una regola ben nota quando si scrive codice è "non ottimizzare in modo prematuro", ma c'è una controparte non molto conosciuta: non pessimizzare prematuramente. Se hai due opzioni per scrivere un pezzo di codice e uno di questi può essere migliore dell'altro, ma non richiede lavoro o complessità aggiuntivi, usalo. Nel tuo esempio non c'è differenza, dal momento che stai utilizzando un tipo predefinito (int). Ma se stavi usando le classi, ci sarebbe una differenza, quindi abituati alla lista di inizializzazione.

+1

In aggiunta a ciò che Gorpik ha scritto ('+ 1' da me per quello, BTW): in linguaggi come Java e C#, dove tutte le variabili sono _references_, questo non importa, perché membro l'inizializzazione è comunque solo un'assegnazione di indirizzi. In C++, i membri di dati di classe sono spesso oggetti autentici, che sono inizializzati sul posto, piuttosto che riferimenti (puntatori) inizializzati per fare riferimento agli oggetti nell'heap. Ad esempio, per un'implementazione ragionevole di 'std :: string', l'inizializzazione predefinita seguita dall'assegnazione potrebbe essere notevolmente più lenta dell'inizializzazione con i dati corretti immediatamente. – sbi

+0

@sbi: non tutte le variabili sono riferimenti in C#. Anche il linguaggio ha dei tipi di valore :) – jalf

+0

@jalf: stavo volutamente semplificando un po 'le cose. – sbi

3

L'ex si chiama elenchi di inizializzazione. È possibile ottenere un sacco di articoli per questo.

i motivi particolari per l'utilizzo di intializer liste sono riportati qui http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/

È possibile fare riferimento Effective C++ per ottenere la piena comprensione intializer liste. Spero sia chiaro.

+2

Come [questo] (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6). –

+0

^^ molto questo ^^ –

0

BTW, Bjarne Stroustrup ha detto in Il C++ Programming Language che alcuni l'efficienza può essere acquisita con la lista di inizializzazione e ha raccomandato di usare la lista di inizializzazione!

+1

Se è possibile fornire un riferimento per questo, è possibile ottenere alcuni voti –

Problemi correlati