2011-11-19 5 views

risposta

8

Sì.

Si potrebbe desiderare di liberarsi della dipendenza ordine di inizializzazione, e scrivere:

C(int _var): var(_var), i(_var*_var) 

In sostanza, facendo dipendo da var, è necessario assicurarsi che var viene dichiarata prima che nella classe.

Allo stesso modo, è possibile inizializzare qualcosa in C che si definisce (e inizializzata) in una classe genitore, perché il genitore sarà costruito prima del C.

Best practice impongono che tu sia a conoscenza di quanto sopra, ed evitare situazioni che ne offuscano qualcuna - forse documentano la dipendenza di io da var, in modo che il programmatore successivo (forse te stesso) non introduca un problema di ordine di inizializzazione.

+1

Voglio sottolineare la seconda frase: 'var' deve essere dichiarato prima di' i' nella classe _definizione_. Non nella lista di inizializzazione (che non ha importanza). –

5

Quel codice ha definito il significato, presupponendo che la moltiplicazione non ecceda.

essere consapevoli che si basa in modo critico sul fatto che var è definito prima di i nella classe (ordine nella lista di inizializzazione è irrilevante, ciò che conta è l'ordine dei membri stessi vengono definiti). Altrimenti i verrebbe inizializzato utilizzando il membro di dati unitario var.

Ma se si ottiene un comportamento erratico con esattamente quel codice, il bug si trova altrove.

5

Sì, questo è sicuro, ma in questo caso bisogna stare attenti. Si utilizza var e non _var, quindi è necessario assicurarsi che var sia stato creato prima dello i. Questo è il caso qui, poiché i membri sono costruiti nell'ordine della loro dichiarazione (in questo caso var, i), che potrebbe essere diverso dall'ordine in cui appaiono nella lista di inizializzazione.

Quindi in questo caso funziona. Sarebbe anche lavorare in questo caso:

C(int _var): i(var*var), var(_var) 

ma non in questo:

class C{ 
    public: 
     C(int _var): var(_var), i(var*var) 
     {} 
    private: 
     int i; 
     int var; 
}; 

Ma, naturalmente, di essere sempre sul sicuro, si potrebbe utilizzare _var:

C(int _var): var(_var), i(_var*_var) 
+0

Ha funzionato! quindi l'ordine di inizializzazione in un attore dipende dall'ordine di dichiarazione delle variabili nel prototipo di classe? Ciò ha senso! – user965369

+1

@ user965369 Questo è il motivo per cui dovresti elencarli in questo ordine nella lista di inizializzazione (che hai fatto), per evitare qualsiasi confusione. –

+0

@ user965369: È necessario attivare gli avvisi del compilatore (-Wall su gcc, \ W3 su VC++), l'avviso su un elenco di inizializzatore ordinato in modo errato è comune e consentirà di realizzare tali errori in precedenza. –

Problemi correlati