Está bien especificado el comportamiento de datos no inicializados?
Nota Estoy usando el compilador de g ++ (que es bastante bueno y se supone que está bastante cerca del estándar).
Tengo la clase más simple que se me ocurre:
class BaseClass {
public:
int pub;
};
Entonces tengo tres programas igualmente simples para crearBaseClass
objeto (s) e imprima el valor [no inicializado] de sus datos.
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
Esto imprime:
B1.pub = 1629556548
Lo cual está bien. De hecho, pensé que se inicializaría a cero porque es un POD o Plain Old Datatype o algo así, pero supongo que no. Hasta aquí todo bien
Case 2BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
BaseClass B2;
cout<<"B2.pub = "<<B2.pub<<endl;
Esto imprime:
B1.pub = 1629556548
B2.pub = 0
Esto es definitivamente extraño. Creé dos de los mismos objetos de la misma manera. Uno se inicializó y el otro no.
Case 3BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
BaseClass B2;
cout<<"B2.pub = "<<B2.pub<<endl;
BaseClass* pB3 = new BaseClass;
cout<<"B3.pub = "<<pB3->pub<<endl;
Esto imprime:
B1.pub = 0
B2.pub = 0
B3.pub = 0
Esto es lo más raro hasta ahora. Todos se inicializan a cero. Todo lo que hice fue agregar dos líneas de código y cambió el comportamiento anterior.
Entonces esto es solo un caso de 'datos no inicializados que conducen a un comportamiento no especificado' o hay algo más lógico 'debajo del capó'?
Realmente quiero entender el comportamiento predeterminado del constructor / destructor porque tengo la sensación de que será muy importante para comprender completamente las cosas de la herencia ..