2010-03-25 9 views
9

Tengo algunas dudas sobre las garantías de orden de construcción e inicialización en C++. Por ejemplo, el siguiente código tiene cuatro clases X, Y, Z y W. La función principal ejemplifica un objeto de class X, que contiene un objeto de class Y, y deriva de class Z, por lo que se invocarán ambos constructores. Además, el parámetro const char* pasado al constructor X se convertirá implícitamente en un objeto de class W, por lo que el constructor W también se debe invocar.C++: garantías de pedido de construcción e inicialización

¿Cuáles son las garantías que ofrece el estándar C++ en el orden de las llamadas a los constructores de copia? O, de manera equivalente, ¿qué puede imprimir este programa?

#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 correcto?

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

El orden será W, Z, Y, X pero no estoy seguro de las reglas específicas. –

+0

¿Cuál es la relación entre Y y W? – curiousguy

Respuesta

15

En todas las clases, el orden de construcción está garantizado: clases base, tal como se especifica de izquierda a derecha, seguidas de las variables miembro en el orden declarado en la definición de clase. El cuerpo constructor de una clase se ejecuta una vez que se hayan completado todas las construcciones de sus bases y miembros.

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

El temporal W se necesita para pasar al constructor de X, por lo que se construyeron antes de la construcción de la x comienza y será destruido una vez que la inicialización de x ultima.

Así que el programa debe imprimir:

W 
Z 
Y 
X 
6

1) Antes que nada, es necesario para calcular los argumentos.

2) Luego se construyen las clases base.

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

4) Entonces Constructor de X se llama

+0

solo para agregar ... las clases base también se construyen en orden de izquierda a derecha, que aparecen mientras herencia –

+0

@Yogesh, por supuesto, gracias –

2
  1. El objeto W se construirá 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. será initalized
  3. Y durante la inicialización miembro
  4. constructor de X se ejecutará.
2

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

2

Para resumir estas son las reglas:

  1. argumentos, tomados de derecha a izquierda
    a. Derecha Most
    b. 2º por la derecha Clase base
  2. base virtual
  3. clases Base de izquierda a derecha
  4. Miembros en orden de declaración de la clase
  5. Constructor de la llamada clase
Cuestiones relacionadas