C++-Programmierung: Strukturen und Unions
Eine aktuelle Seite zum gleichen Thema ist unter C++-Programmierung/ Im Zusammenhang mit Klassen verfügbar.
Bevor wir uns mit dem eigentlichen Kernbegriff der objektorientierten Programmierung, der Klasse, beschäftigen, wird in diesem Kapitel - zum besseren Verständnis - der Begriff der Struktur eingeführt.
Strukturen
BearbeitenEine Struktur (struct(ure)) ist ein Datentyp, der mehrere Variablen gleichen oder verschiedenen Typs zu einem neuen Datentyp zusammenfasst. Die Deklaration erfolgt mit dem Schlüsselwort struct
. Beispiel:
struct Struktur
{
int a;
bool b;
};
Das Semikolon nach der geschweiften Klammer schließt die Definition der Struktur ab.
Nun kann der Name Struktur
wie ein primitiver Typname verwendet werden, um eine Instanz zu erstellen:
Struktur s1;
Die „Einzelteile“ des Objekts heißen Datenelemente (auch die Begriffe Komponenten, Eigenschaften, Attribute oder data members sind gebräuchlich). Mit dem Operator .
(Punkt) kann auf die einzelnen Daten zugegriffen werden:
s1.a = 17;
s1.b = false;
Ein solcher struct
ist bei C++ jedoch auch eine Klasse und kann genauso verwendet werden und Methoden erhalten.
class Struktur2
{
public:
int a;
bool b;
};
Der einzige Unterschied ist die Standardvorgabe, dass die enthaltenen Deklarationen bei Verwendung von Schlüsselwort struct
öffentlich sind und bei class
privat.
Unions
BearbeitenEine Union ist eine Vereinigung verschiedener Typen auf einer Adresse. Dies erleichtert Redefinitionen oder die Verwendung von Variantentypen. Sie nimmt nicht mehrere Elemente nebeneinander auf, sondern zu jedem Zeitpunkt immer nur eines. Wird eine der Definitionsvarianten initialisiert, so werden die anderen damit implizit initialisiert, da sie auf der gleichen Adresse beginnen. Sie wird mit dem Schlüsselwort union
deklariert:
union _Union1
{
int a;
float b;
char caC[4]; // 32bit float/int angenommen
};
Beispiel zur Verwendung:
_Union1 u1; // Instanz erzeugen
u1.a = 10; // jetzt ist in u1 ein int gespeichert
u1.b = 2.5; // jetzt ein float
// damit hat u1.a möglicherweise keinen sinnvollen Wert mehr
ofstream DateiStream("xxx.data");
DateiStream << u1.caC; // Damit wird der Dateninhalt als Rohdaten verwendet
Bei Einsatz von Datenstrukturen mit fester Ausrichtung kann hilfs einer union
die gesamte Datensammlung als Rohdaten aus dem Speicher betrachtet werden. Zum Beispiel mit einer anonymen union die eine Datensammlungsstruktur und einen direkt ansprechbaren Zeiger auf deren Rohdaten enthält.
Zugriffsattribute
BearbeitenDie Members von Strukturen und Unions sind öffentlich zugänglich (public), wenn nichts anderes vereinbart wird. Wie bei Klassen kann der Zugriff auf protected oder private eingeschränkt werden. (Der einzige Unterschied zwischen einer Klasse und einer Struktur besteht in C++ tatsächlich darin, dass der Default-Zugriff bei einer Klasse private ist, bei einer Struktur hingegen public.)