Strukturen und Vereinigungen in C++

Diese Lektion behandelt structs und unions in C++. Ziel ist, komplexe Datentypen zu definieren, zu speichern und korrekt zu verwenden.

1. Strukturen

Eine Struktur ist ein zusammengesetzter Datentyp, der mehrere verschiedene Datenelemente unter einem Namen zusammenfasst.
struct Punkt {
    double x;
    double y;
};

Punkt p1;         // Deklaration
p1.x = 3.0;
p1.y = 4.0;

std::cout << "Punkt: (" << p1.x << ", " << p1.y << ")" << std::endl;

2. Initialisierung von Strukturen

Strukturen können direkt bei der Deklaration initialisiert werden.
Punkt p2 = {1.0, 2.0};
std::cout << "p2: (" << p2.x << ", " << p2.y << ")" << std::endl;

3. Arrays von Strukturen

Man kann Arrays von Strukturen definieren, um mehrere Objekte desselben Typs zu speichern.
Punkt punkte[3] = {{0,0}, {1,2}, {3,4}};
for(int i=0;i<3;i++)
    std::cout << "Punkt " << i << ": (" << punkte[i].x << ", " << punkte[i].y << ")" << std::endl;

4. Strukturen als Parameter

Strukturen können an Funktionen übergeben werden – entweder by value oder by reference.
void printPunkt(const Punkt& p) {
    std::cout << "(" << p.x << ", " << p.y << ")" << std::endl;
}

printPunkt(p1);

5. Vereinigungen (Unions)

Eine union ist ein spezieller zusammengesetzter Typ, bei dem alle Mitglieder denselben Speicherbereich teilen.
union Zahl {
    int i;
    float f;
};

Zahl z;
z.i = 42;
std::cout << "i = " << z.i << std::endl;

z.f = 3.14;
std::cout << "f = " << z.f << std::endl;
// Achtung: z.i ist nun undefiniert
Unions sparen Speicher, aber nur ein Mitglied kann zu einem Zeitpunkt sinnvoll genutzt werden.

6. Strukturen vs. Klassen

In C++ ist der einzige Unterschied zwischen struct und class die Standardzugriffssteuerung:
struct Punkt {
    double x;
    double y; // public standard
};

class PunktC {
    double x;
    double y; // private standard
public:
    void set(double a, double b) { x=a; y=b; }
    void print() { std::cout << x << "," << y << std::endl; }
};

7. Zusammengesetzte Strukturen

Strukturen können andere Strukturen als Mitglieder enthalten.
struct Kreis {
    Punkt mittelpunkt;
    double radius;
};

Kreis k = {{0,0}, 5.0};
std::cout << "Kreis: Mittelpunkt(" << k.mittelpunkt.x << "," << k.mittelpunkt.y << "), Radius " << k.radius << std::endl;

8. Zusammenfassung