C++-Programmierung: Strukturen und Unions

Alte Seite
Diese Seite gehört zum alten Teil des Buches und wird nicht mehr gewartet. Die Inhalte sollen in das neue Buch einfließen: C++-Programmierung/ Inhaltsverzeichnis.
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

Bearbeiten

Eine 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.

Eine 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

Bearbeiten

Die 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.)