2010-12-08 11 views
11

En C++ 98confusión en la comprensión C++ normas

12.6.2/4: Después de la llamada a un constructor para la clase X se ha completado, si un miembro de X no es ni especifica en el constructor de mem-initializers, ni default-initialized, ni inicializado durante la ejecución del cuerpo del constructor, el miembro tiene un valor indeterminado.

¿Qué ni inicializado durante la ejecución del cuerpo del constructor quiere decir? ¿Puede un miembro ser inicializado dentro del cuerpo del constructor?

Respuesta

11

ni inicializado durante la ejecución del cuerpo del constructor no es correcto en mi humilde opinión.

Las formulaciones han sido cambiado en C++ 03 de ni inicializado (en C++ 98) para ni dado un valor

Después de la llamada a un constructor para la clase X ha completado , si un miembro de X no está especificado en los inicializadores de memoria del constructor, ni inicializado por defecto, ni valor inicializado, ni dado un valor durante la ejecución del cuerpo del constructor, el miembro tiene un valor indeterminado.

+0

No tengo una copia de C++ 03. ¿De dónde puedo obtenerlo? – Bazinga

+0

IOW en el fragmento "ni inicializado durante la ejecución del cuerpo del constructor", el estándar C++ 03 usa la palabra "inicializado" de una manera informal para significar "asignado un valor". –

+3

@Bazinga: No puedes obtenerlo gratis. –

3

De hecho, es muy simple. Los miembros de clase/estructura pueden incluir objetos con constructores por defecto, pero si no lo hacen, y no se molestan en darles un valor en la lista de inicializadores, ni en establecerlos dentro del cuerpo del constructor, entonces básicamente la memoria que ellos tienen ocupar - lo que sea que se les escapó de la pila o montón - todavía tendrá basura vieja allí, es decir, un valor indeterminado.

Considere:

struct X 
{ 
    X() : x1(1) { x2 = 2; } 
    double x1, x2, x3; 
    std::string x4; 
}; 

Aquí, x1 y x2 se inicializan explícitamente por X 's constructor, y x4 - siendo un std::string - es el valor predeterminado construido para ser ""/longitud 0. , sin embargo, podría sea ​​cualquier cosa, y no debería leerse hasta después de que se haya configurado (es un comportamiento indefinido y realmente podría afectar a algunos sistemas), considere que el patrón de bits de la memoria que ocupa puede no ser un valor válido para un doble, por lo que desde allí podría desencadenar alguna excepción/captura/interrupción de la CPU).

+0

No tengo una copia de C++ 03. ¿De dónde puedo obtenerlo? – Bazinga

+0

Solo el borrador final está disponible de forma gratuita; un google rápido muestra muchas fuentes, p. Ej. http://www.kuzbass.ru:8086/docs/isocpp/.Por lo general, eso es más conveniente para mí, pero puede solicitar una copia oficial de la versión final por una pequeña tarifa (20 o 30 dólares estadounidenses) ... No recuerdo exactamente de dónde. –

+1

@Bazinga: véase [6.3] en http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.13 para obtener instrucciones sobre cómo obtener una copia de la norma. –