Question 1: par Défaut, les constructeurs ne initialiser POD membres à 0 selon la norme C++. Voir le texte cité ci-dessous.
Question 2: Si un constructeur doit être spécifié dans une classe de base, alors que la classe ne peut pas faire partie d'un syndicat.
Enfin, vous pouvez fournir un constructeur pour votre union:
union U
{
A a;
B b;
U() { memset( this, 0, sizeof( U ) ); }
};
Pour Q1:
À partir de C++03, 12.1 Constructeurs, page 190
La implicitement par défaut définis par le constructeur effectue l'ensemble des initialisations de l'
classe qui serait effectuée par un utilisateur écrit dans le constructeur par défaut pour la classe avec un vide mem-initialiseur de liste (12.6.2) et un vide corps de la fonction.
À partir de C++03, 8.5 Initialiseurs, page 145
À défaut d'initialisation d'un objet de type T signifie:
- si T est un non-POD type de classe
(article 9), le constructeur par défaut
pour T est appelé (et le
l'initialisation est mal formé, si T
n'a pas accessible par défaut
le constructeur);
- si T est de type tableau, chaque élément par défaut est initialisée;
-
sinon, l'objet est initialisé à zéro.
À zéro-initialiser un objet de type T signifie:
- si T est un type scalaire (3.9), l'objet est défini à la valeur de 0 (zéro) est converti en T;
-
si T est un non-union type de classe, chaque membre de données statiques et chaque classe de base sous-objet est initialisé à zéro;
-
si T est un type d'union, l'objet premier de données nommée membre est initialisé à zéro;
- si T est de type tableau, chaque élément est initialisé à zéro;
- si T est un type de référence, pas d'initialisation est effectuée.
Pour Le T2:
À partir de C++03, 12.1 Constructeurs, page 190
Un constructeur est trivial si il est implicitement déclarée de constructeur par défaut, et si:
- sa classe n'a pas de fonctions virtuelles (10.3) et pas de virtuel classes de base (10.1), et
- tous les directe les classes de base de sa classe ont trivial constructeurs, et
- pour tous les non statiques de données des membres de sa classe qui sont de type classe (ou d'une matrice,
de celui-ci), chaque classe a un trivial constructeur
À partir de C++03, 9.5 Syndicats, page 162
Une union peut avoir les fonctions membres (y compris les constructeurs et destructeurs), mais pas virtuel (10.3) de fonctions. Un syndicat ne peut pas les classes de base. Un syndicat ne peut pas être utilisée comme classe de base.Un objet d'une classe avec un non-trivial constructeur (12.1), un non-trivial constructeur de copie (12.8), un non-trivial destructeur (12.4), ou à un non-trivial copie opérateur d'affectation (13.5.3, 12.8) ne peut pas être membre d'un syndicat, ni un tableau de ces objets