Pregunta

Tengo algunas dudas acerca de la construcción y de la orden de inicialización garantías en C ++. Por ejemplo, el siguiente código tiene cuatro clases X, Y, Z y W. La función principal crea la instancia de un objeto de class X, que contiene un objeto de class Y, y deriva de class Z, por lo tanto constructores será llamado. Adicionalmente, el parámetro const char* pasado al constructor de X se convertirá implícitamente a un objeto de class W, por lo que el constructor de W también debe ser llamado.

¿Cuáles son las garantías del estándar C ++ da en el orden de las llamadas a los constructores de copia? O, en forma equivalente, lo que se permite que este programa para imprimir?

#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;
}

editar:? Es esto correcto

   W      |
 /   \    |
Z     Y   |
 \   /    |
   X      V
¿Fue útil?

Solución

En todas las clases para la construcción está garantizada: clases de base, como se especifica de izquierda a derecha seguido de variables miembro en el orden declarado en la definición de clase. cuerpo del constructor de la clase A se ejecuta una vez la totalidad de sus bases y de los miembros construcciones han completado.

En su ejemplo X se deriva de Z y contiene Y por lo que el objeto base Z se construye primero, entonces el Y miembro y, a continuación, la construcción de las ultima X con la ejecución de cuerpo del constructor de X.

Se necesita el W temporal para pasar al constructor de X, por lo que se construyó antes de que comience la construcción de la x y serán destruidos una vez se complete la inicialización de x.

Así que el programa debe imprimir:

W
Z
Y
X

Otros consejos

1) En primer lugar, es necesario para calcular los argumentos.

2) A continuación, las clases base se construyen.

3) A continuación, los miembros se construyen en el orden de aparición en la declaración de la clase.

4) A continuación, Constructor de X se llama

  1. El objeto W será construido antes de que el constructor para X se llama.
  2. Z, como una clase base de X, se inicializará antes de que los miembros de X.
  3. Y será initalized durante la inicialización miembro
  4. El constructor de X se ejecutará.

Para ampliar la respuesta de Charles Bailey, las reglas cambian cuando sus clases base se heredan de forma virtual. Siempre se me olvida lo que el orden es, el sitio de IBM dice que las bases virtuales se inicializan primero, pero yo nunca he encontrado un caso en el que en realidad es más de trivia.

Para resumir estas son las reglas:

  1. Los argumentos, tomados de derecha a izquierda
     a. La mayor parte derecha
     si. 2º por la derecha
  2. Clase base
  3. base virtual
  4. Las clases base de izquierda a derecha
  5. Miembros en orden de declaración de la clase
  6. Constructor de la clase llamada
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top