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).
No tengo una copia de C++ 03. ¿De dónde puedo obtenerlo? – Bazinga
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". –
@Bazinga: No puedes obtenerlo gratis. –