Domanda

ho qualche dubbio sulla costruzione e l'ordine di inizializzazione garanzie in C ++. Ad esempio, il seguente codice ha quattro classi X, Y, Z e W. La funzione principale un'istanza di un oggetto di class X, che contiene un oggetto di class Y, e deriva da class Z, così si chiamerà entrambe costruttori. Inoltre, il parametro const char* passato al costruttore di X verrà convertito in modo implicito un oggetto di class W, quindi il costruttore di W deve essere chiamato.

Quali sono le garanzie di serie C ++ dà l'ordine delle chiamate ai costruttori di copia? O, equivalentemente, che cosa è consentito questo programma per stampare?

#include <iostream>

class Z {
   public:
   Z() { std::cout << "Z" << std::endl; }
};

class Y {
   public:
   Y() { std::cout << "Y" << std::endl; }
};

class W {
   public:
   W(const char*) { std::cout << "W" << std::endl; }
};

class X : public Z {
   public:
   X(const W&) { std::cout << "X" << std::endl; }
   private:
   Y y;
};

int main(int, char*[]) {
   X x("x");
   return 0;
}

modifica:? È corretto

   W      |
 /   \    |
Z     Y   |
 \   /    |
   X      V
È stato utile?

Soluzione

In ogni ordine classi costruzione è garantita: classi di base, come specificato da sinistra a destra seguita da variabili membro nell'ordine dichiarato nella definizione della classe. corpo del costruttore di una classe viene eseguito una volta tutte le sue basi e dei membri le costruzioni hanno completato.

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

Il W temporanea è 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.

Quindi, il programma deve stampare:

W
Z
Y
X

Altri suggerimenti

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

2) Quindi classi base sono costruiti.

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

4) Poi Costruttore di X si chiama

  1. L'oggetto W sarà costruito 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.

Per espandere sulla risposta di Charles Bailey, le regole cambiano quando le tue classi base sono ereditate virtualmente. Mi dimentico sempre ciò che l'ordine è, sito IBM afferma che le basi virtuali sono inizializzati prima, ma ho appena mai incorrere in un caso in cui in realtà è più di curiosità.

In sintesi queste sono le regole:

  1. Argomenti, presi da destra a sinistra
     un. Diritto più
     b. 2 ° da destra
  2. Classe base
  3. base virtuale
  4. classi Base da sinistra a destra
  5. Membri in ordine di dichiarazione in classe
  6. Costruttore di chiamata di classe
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top