Déclarations d'union

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Unions - Index

La syntaxe générale des déclarations d'unions ressemble beaucoup à celle des structures. Les différences sont les suivantes :

  • Les unions peuvent contenir des champs de bits, mais un seul peut être actif. Ces champs débutent tous au commencement de l'union. (Rappelez-vous que des problèmes se posent lors de l'écriture de code portable : en effet, les champs de bits dépendent de la machine utilisée.)
  • Contrairement aux structures, les types unions en C++ ne peuvent pas utiliser les spécificateurs d'accès aux classes : public, private et protected. Tous les champs d'une union sont de type "public".
  • Il n'est possible d'initialiser les unions que par le biais de leur premier membre déclaré :
union local87 {
   int i;
   double d;
   } a = { 20 };

Une union ne peut pas figurer dans une hiérarchie de classes. Elle ne peut pas non plus être dérivée d'une classe, ni être une classe de base. En revanche, une union peut avoir un constructeur.

Unions non restreintes

A partir de C++11, certaines restrictions mentionnées ci-dessus ont été désactivées.

Les unions peuvent maintenant contenir des objets qui ont un constructeur non trivial. Si une union contient un tel objet, le constructeur par défaut implicite de l'union est supprimé, forçant l'utilisateur à définir manuellement un constructeur. Par exemple :

 #include <new> // Required for placement 'new'.
  
 struct 3DPoint {
     3DPoint() {}
     3DPoint(int x, int y, int z): x_(x), y_(y), z_(z) {}
     int x_, y_, z_;
 };
  
 union U {
     double w;
     3DPoint p; // Allowed in C++11.
     U() {new(&p) 3DPoint();} // Due to the 3DPoint member, a user-defined constructor is now required.
 };

Voir aussi