2010-03-25 7 views
9

Ho qualche dubbio sulla costruzione e sulle garanzie dell'ordine di inizializzazione in C++. Ad esempio, il codice seguente ha quattro classi X, Y, Z e W. La funzione principale istanzia un oggetto di class X, che contiene un oggetto di class Y e deriva da class Z, quindi verranno richiamati entrambi i costruttori. Inoltre, il parametro const char* passato al costruttore di X verrà convertito implicitamente in un oggetto di class W, pertanto è necessario chiamare anche il costruttore di W.C++: garanzie dell'ordine di costruzione e di inizializzazione

Quali sono le garanzie fornite dallo standard C++ sull'ordine delle chiamate ai costruttori di copie? O, in modo equivalente, cosa può stampare questo programma?

modifica: è corretto?

W  | 
/ \ | 
Z  Y | 
\ / | 
    X  V 
+1

L'ordine sarà W, Z, Y, X ma non sono sicuro delle regole specifiche. –

+0

Qual è la relazione tra Y e W? – curiousguy

risposta

15

In tutte le classi l'ordine di costruzione è garantito: classi di base, come specificato da sinistra a destra seguite dalle variabili membro nell'ordine dichiarato nella definizione della classe. Il corpo del costruttore di una classe viene eseguito una volta che tutte le sue basi e le sue costruzioni sono state completate.

Nel tuo esempio X deriva da Z e contiene Y modo che l'oggetto Z base è costruito per primo, poi il Y membro y, quindi la costruzione della X completa con l'esecuzione del corpo del costruttore X s'.

Il temporaneo W è necessaria per passare al costruttore di X, quindi è costruita prima della costruzione del x inizia e verrà distrutto una volta l'inizializzazione di x è completa.

Così il programma deve stampare:

W 
Z 
Y 
X 
6

1) Prima di tutto, è necessario calcolare gli argomenti.

2) Quindi vengono create le classi base.

3) Quindi i membri sono costruiti nell'ordine di apparizione nella dichiarazione della classe.

4) Poi Costruttore di X è chiamato

+0

solo per aggiungere ... le classi di base sono anche costruite nell'ordine da sinistra a destra che appaiono mentre l'ereditarietà –

+0

@Yogesh, ovviamente, grazie –

2
  1. L'oggetto W saranno costruiti prima del costruttore di X è chiamato.
  2. Z, come classe base di X, sarà inizializzato prima che i membri di X.
  3. Y sarà initalized durante l'inizializzazione membro
  4. il costruttore di X verrà eseguito.
2

Per espandere sulla risposta di Charles Bailey, le regole cambiano quando le tue classi base sono ereditate virtualmente. Ho sempre dimenticato quale sia l'ordine, il sito IBM dice che le basi virtuali sono inizializzate per prime ma non ho mai incontrato un caso in cui in realtà è più che banalità.

2

In sintesi queste sono le regole:

  1. Argomenti, presi da destra a sinistra
    a. Right Most
    b. 2 ° da destra
  2. Classe base
  3. base virtuale
  4. classi Base da sinistra a destra
  5. Utenti in ordine di dichiarazione in classe
  6. Costruttore di detta classe
Problemi correlati