2010-07-07 5 views
5

Ho appena letto un comment by GMan cheGli inizializzatori vuoti sono preferiti per l'inizializzazione predefinita di membri interi?

class A 
{ 
public: 
    A() : 
     m_ptr() // m_ptr is implicitly initialized to NULL 
    { } 
}; 

dovrebbe essere preferito su

class A 
{ 
public: 
    A() : 
     m_ptr(NULL) // m_ptr is explicitly initialized to NULL 
    { } 
}; 

Avviso la mancanza di NULL nel primo esempio.

GMan è corretto? Questo potrebbe essere un po 'soggettivo, quindi "Preferisci inizializzatori vuoti per l'inizializzazione predefinita?" potrebbe essere più appropriato.

Anche se si preferiscono inizializzatori vuoti, fare questo si applica ad altri membri integrali?

class B 
{ 
public: 
    B() : 
     m_count(), 
     m_elapsed_secs() 
    {} 
private: 
    std::size_t m_count; 
    float m_elapsed_secs; //the elapsed time since instantiation 
}; 

Naturalmente, si prega di difendere il tuo punto di vista con una descrizione del motivo per cui uno dovrebbe essere preferito rispetto all'altro.

+0

Qualcuno più creativo di me ha un titolo migliore, quindi smetto di ricevere risposte sbagliate? Chi avrebbe pensato che * potessi * ottenere risposte sbagliate a una domanda sulle migliori pratiche. –

+2

Penso che il titolo sia chiaro e la domanda ben scritta. Poi di nuovo, so già cosa stai chiedendo. Le risposte sbagliate erano probabilmente solo equivoci della lingua, non la tua domanda. – GManNickG

risposta

7

preferisco l'esplicitazione. Come alcuni dei le risposte sbagliate a questa domanda hanno dimostrato, non è evidente a tutti che, dicono, int() e int(0) sono equivalenti.

Suppongo di no fornire un valore esplicito ha il vantaggio che non sarà necessario rivedere l'elenco di inizializzazione, se Eva r cambia il tipo.

+0

Si potrebbe obiettare che non è necessario rivedere l'elenco di inizializzazione quando il tipo cambia è negativo (quando init predefinito non è più quello che si desidera per il nuovo tipo). –

-1

penso che siano cose diverse, è possibile che tu stai confondendo NULL con void significa int main() è lo stesso di int main(void) ma NON int main(NULL) (In C++ NULL è equivalente a 0

+2

Non ci sono definizioni di funzioni nella mia domanda. Sto chiedendo di inizializzare il membro nella lista di inizializzazione di una classe. –

2

L'inizializzazione predefinita è necessaria quando si scrive una classe modello per inizializzare i membri predefiniti dei tipi dipendenti. Per altri casi non ci sono differenze reali se si desidera inizializzare il membro in modo predefinito. Ma ci sono alcuni casi in cui si desidera ottenere un comportamento non predefinito.

Un campione quando l'inizializzazione di default non è adatto:

struct X { 
    HANDLE some_file_handle; 
    // note that INVALID_HANDLE_VALUE is not equal to 0 in Windows 
    X() : some_file_handle(INVALID_HANDLE_VALUE) {} 
}; 

Come per l'utilizzo NULL vs inizializzazione di default Ho un altro esempio: in Visual Studio 2010 che è dichiarato di essere in qualche modo conforme con C++ 0x NULL è ancora definito come 0, ma in C++ 0x è necessario utilizzare nullptr per inizializzare i puntatori. E nullptr non è definito in C++ '03. Ma probabilmente vuoi rendere portatile il tuo codice. In tal caso, per inizializzare i puntatori, preferirò un'inizializzazione predefinita rispetto all'inizializzazione del valore.

2

In primo luogo, ho detto che è discutibilmente migliore, non che lo sia. :) Inoltre, era più su come liberarsi di NULL; Mi capita solo di usare niente al posto di 0. Ma una domanda interessante comunque.

Probabilmente è solo una questione di stile, ma è importante notare, as Johannes did, che non è solo uno stile sintattico; fanno cose diverse. È semplicemente facile rendere quelle cose diverse le stesse.

Preferisco inizializzazione del valore, perché non sto prendendo alcuna parte di come il valore viene inizializzato; Sto semplicemente dicendo "essere inizializzato". Al contrario, una volta introdotto un valore, si influisce sul modo in cui il valore viene inizializzato.

penso che si sarebbe fatica a trovare una situazione dove il valore-inizializzazione è chiaramente meglio, basta scegliere quale si adatta di più.

+0

Preferisci l'inizializzazione del valore nel caso di 'classe B'? Per me, è stato un po 'strano non inizializzare una variabile count a 0. –

+2

Penso che GMan non dovrebbe rispondere alla domanda "GMan è giusto". È una specie di ricorsione. :) –

+0

@Caspin: Sì. Mi sento semplicemente a mio agio sapendo che sarà comunque inizializzato a 0, quindi ritengo che specificare la costante sia comunque uno spreco. :) Quindi, di nuovo, essere espliciti può essere più facile da leggere. – GManNickG