2010-04-19 7 views
29

En el siguiente código, cuando se llama al ctor de X, ¿se llamará primero al ctor de A o B? ¿El orden en el que se colocan en el cuerpo de la clase controla esto? Si alguien puede proporcionar un fragmento de texto del estándar de C++ que habla sobre este tema, sería perfecto.C++: orden de inicialización de los miembros de datos de clase

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

Respuesta

46

El orden es el orden en que aparecen en la definición de clase - se trata de la sección 12.6.2 del estándar de C++:

5 inicialización procederá de la siguiente orden:

- Primera , y sólo para el constructor de la clase más derivada como se describe a continuación, base virtual clases se inicializan en el orden de que aparezcan en una recorrido en profundidad primero de izquierda a derecha de la gráfico acíclico dirigido de las clases base , donde "de izquierda a derecha" es el orden de aparición de los nombres de la clase base en la clase derivada base-especificador-lista.

- Entonces, clases base directos se inicializará en orden de la declaración tal como aparecen en el especificador-lista de base (independientemente de el orden de los MEM-inicializadores).

- A continuación, los miembros de datos estáticos se inicializan en el orden en que fueron declarado en la definición de la clase (de nuevo sin tener en cuenta el orden de los MEM-inicializadores).

- Finalmente, se ejecuta el cuerpo del constructor. [Nota: la orden de declaración es obligatoria para asegurar que los subobjects base y miembro se destruyan en el orden inverso de la inicialización . ]

+2

Guau, solo estaba enviando. Gramo. – GManNickG

+4

@GMan La carrera no siempre es rápida. Excepto cuando es. –

+0

Tuve que esperar para aceptar la respuesta durante 7 minutos después de su publicación, fue tan rápido. No sabía que SO tenía esta restricción para aceptar respuestas. – Nikhil

8

inicialización está siempre en el orden en que los miembros de la clase aparecen en su definición de clase, por lo que en su ejemplo a, entonces b.

Hay un punto de secuencia entre la inicialización de cada miembro y que puede pasa una referencia a un miembro todavía-a-ser inicializado en el constructor de un miembro de la clase, sino que sólo sería capaz de utilizarlo en el limitado formas (como tomar su dirección para formar un puntero), otros usos pueden causar un comportamiento indefinido.

La destrucción de los miembros de la clase siempre ocurre en el orden inverso de la construcción.

El orden de inicialización de las bases y miembros se define en 12.6.2 [class.base.init]/5.

+0

¿Podría proporcionar una referencia? – Nikhil

+0

Para agregar a esto, si tiene un constructor para X como este - X(): b(), a() {} a todavía se inicializa primero. –

+0

Sé esto. Estoy pidiendo una referencia. Confiadamente le dije esto a alguien que me pidió una referencia y no pude encontrar ninguna. De ahí la pregunta. – Nikhil

Cuestiones relacionadas