Pregunta 1: Los constructores predeterminados inicializan los miembros POD a 0 según el estándar C++. Ver el texto citado a continuación.
Pregunta 2: Si se debe especificar un constructor en una clase base, esa clase no puede formar parte de una unión.
Por último, se puede proporcionar un constructor para su unión:
union U
{
A a;
B b;
U() { memset(this, 0, sizeof(U)); }
};
Para P1:
De C++ 03, 12.1 constructores, pg 190
El constructor por defecto definido implícitamente realiza el conjunto de inicializaciones de la clase que realizaría un constructor predeterminado escrito por el usuario para esa clase con una lista-inicializador-memoria vacía (12.6.2) y un cuerpo de función vacío.
De C++ 03, 8.5 Inicializadores, pg 145
Para default-inicializar un objeto de tipo T significa:
- si T es un tipo de clase no POD (cláusula 9), el constructor predeterminado para T se llama (y la inicialización está mal formada si T no tiene un constructor predeterminado accesible);
- si T es un tipo de matriz, cada elemento se inicializa por defecto;
- de lo contrario, el objeto se inicializa en cero.
Para cero inicializar un objeto de tipo T significa:
- si T es un tipo escalar (3.9), el objeto se establece en el valor de 0 (cero) convertido a T;
- si T es un tipo de clase no-unión, cada miembro de datos no estático y cada subobjeto de clase base tiene cero inicializado;
- si T es un tipo de unión, el primer miembro de datos con nombre del objeto se inicializa en cero;
- si T es un tipo de matriz, cada elemento se inicializa en cero;
- si T es un tipo de referencia, no se realiza ninguna inicialización.
Para Q2:
De C++ 03, 12.1 constructores, pg 190
Un constructor es trivial si se trata de un constructor por defecto declarado implícitamente -y si:
- su clase no tiene funciones virtuales (10.3) ni clases base virtuales (10.1), y
- todas las clases base directas de su clase tienen constructores triviales, y
- para todos los miembros de datos no estáticos de su clase que son de tipo de clase (o del mismo array ), cada uno de tales clase tiene un constructor trivial
De C++ 03, 9,5 Uniones, pg 162
Una unión puede tener funciones miembro (incluidos constructores y destructores), pero no funciones virtuales (10.3). Una unión no debe tener clases base. Una unión no se utilizará como una clase base. Un objeto de una clase con un constructor no trivial (12.1), un constructor de copia no trivial (12.8), un destructor no trivial (12.4) o un elemento no trivial. el operador de asignación de copia (13.5.3, 12.8) no puede ser miembro de una unión, ni puede una matriz de tales objetos
Lo que falta aquí es que, a pesar del nombre, los constructores predeterminados no inicializan por defecto los miembros de POD. 12.6.2/4 dice lo que sucede cuando un miembro no se menciona en una lista de inicializadores, y según su cita de 12.1, esto se aplica a los ctors implícitos. Dice: "Si la entidad es un miembro de datos no estáticos de ... clase tipo ... y la clase de entidad es una clase no POD, la entidad se inicializa por defecto ... de lo contrario, la entidad no se inicializa ". Entonces, los miembros de datos POD no son inicializados por el constructor generado implícitamente. Los miembros de datos que no son POD son inicializados por defecto. –
esta respuesta está desactualizada ... ver mi respuesta para C++ 11 debajo de –