Deklaration von Varianten
Nach oben zu Varianten - Index
Die allgemeine Deklarationssyntax für Varianten (Unions) stimmt fast vollständig mit der für Strukturen überein. Es gibt jedoch folgende Unterschiede:
- Varianten können Bitfelder enthalten, aber nur jeweils eines der Bitfelder kann aktiv sein. Alle diese Bitfelder beginnen am Anfang der Variante. (Beachten Sie, dass Bitfelder maschinenabhängig sind und es dadurch beim Schreiben von portierbarem Programm-Quelltext zu Problemen kommen kann.)
- Anders als C++-Strukturen können C++-Varianten nicht die Klassenzugriffs-Bezeichner public, private und protected verwenden. Alle Felder einer Variante sind öffentlich.
- Varianten können nur über ihr erstes deklariertes Element initialisiert werden:
union local87 { int i; double d; } a = { 20 };
Eine Variante kann kein Bestandteil einer Klassenhierarchie sein. Sie kann weder eine Basisklasse sein noch von einer anderen Klasse abgeleitet werden. Eine Variante kann aber einen Konstruktor haben.
Uneingeschränkte Varianten
Ab C++11 sind einige der oben genannten Einschränkungen nicht mehr gültig.
Varianten (Unions) können jetzt Objekte mit einem nicht trivialen Konstruktor enthalten. Wenn eine Variante ein derartiges Objekt enthält, wird der implizite Standardkonstruktor der Variante gelöscht. Der Benutzer ist daher gezwungen, den Konstruktor manuell zu definieren. Zum Beispiel:
#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.
};