2010-04-19 16 views
29

Nel codice seguente, quando il ctor di X è chiamata sarà il ctor di A o B essere chiamato prima? Controlla l'ordine in cui sono posizionati nel corpo della classe? Se qualcuno può fornire uno snippet di testo dallo standard C++ che parla di questo problema, sarebbe perfetto.C++: inizializzazione Ordine di Classe Membri dati

class A {}; 
class B {}; 
class X 
{ 
A a; 
B b; 
}; 

risposta

46

L'ordine è l'ordine in cui appaiono nella definizione della classe - questo è dalla sezione 12.6.2 del ++ standard C:

5 inizializzazione procede nel seguente ordine :

- First , e solo per il costruttore della massima derivazione classe come descritto di seguito, base virtuale classi sono inizializzate nell'ordine appaiono su un attraversamento da sinistra a destra in profondità delGrafico aciclico direttodelle classi di base, dove "da sinistra a destra" è l'ordine di comparsa dei nomi di classe base nella classe derivata elenco-specificatore di base.

- Poi, classi base dirette va inizializzato in ordine di dichiarazione come appaiono nel base-specificatore-list (indipendentemente l'ordine delle mem-inizializzatori).

- Poi, i membri dati non statici sono inizializzati nell'ordine in cui sono stati dichiarati nella definizione della classe (ancora una volta indipendentemente dall'ordine dei MEM-inizializzatori).

- Infine, viene eseguito il corpo del costruttore. [Nota: l'ordine di dichiarazione è obbligatorio a assicurarsi che gli oggetti secondari di base e membri vengano eliminati nell'ordine inverso di inizializzazione . ]

+2

Wow, stavo solo sottomettendo. Gr. – GManNickG

+4

@GMan La gara non è sempre alla velocità. Tranne quando è. –

+0

Ho dovuto aspettare per accettare la risposta per 7 minuti dopo che è stato pubblicato, è stato così veloce. Non sapevo che SO avesse questa restrizione nell'accettare le risposte. – Nikhil

8

inizializzazione è sempre nell'ordine in cui i membri della classe appaiono nella definizione della classe, così nel tuo esempio a, quindi b.

C'è un punto sequenza tra l'inizializzazione di ciascun membro e si può passare un riferimento ad un elemento ancora da inizializzare nel costruttore di un membro della classe ma si sarebbe solo in grado di utilizzare in limitata modi (come prendere il suo indirizzo per formare un puntatore), altri usi potrebbero causare un comportamento indefinito.

La distruzione dei membri della classe avviene sempre nell'ordine inverso di costruzione.

L'ordine di inizializzazione di basi e membri è definito in 12.6.2 [class.base.init]/5.

+0

Potrebbe fornire un riferimento? – Nikhil

+0

Per aggiungere a questo, se si dispone di un costruttore per X come questo - X(): b(), a) {} un (è ancora inizializzato prima. –

+0

Lo so. Sto chiedendo un riferimento. Ho detto questo con sicurezza a qualcuno che ha chiesto un riferimento e non sono riuscito a trovarne uno. Da qui la domanda. – Nikhil

Problemi correlati