Klasse oder Struktur in C++: Die ewige Debatte
\n\nStellen Sie sich vor: Sie schreiben Code in C++ und müssen einen neuen Datentyp erstellen. Sofort taucht die Frage auf: „Wann sollte ich class und wann struct verwenden?“. Diese Frage quält nicht nur Anfänger – auf Stack Overflow hat sie tausende Aufrufe und Dutzende hitzige Diskussionen gesammelt. Und das ist kein Wunder: Denn in C++ tun diese beiden Schlüsselwörter auf den ersten Blick dasselbe, jedoch mit Nuancen.
\n\nIn diesem Artikel klären wir ein für alle Mal, was der wirkliche Unterschied zwischen class und struct ist, wann man was wählt und wie man keine Fehler macht. Los geht's!
Der Hauptunterschied: Standard-Zugriffsmodifikatoren
\n\nWenn Sie denken, dass class und struct völlig unterschiedliche Entitäten sind, irren Sie sich. In C++ besteht der einzige grundlegende Unterschied zwischen ihnen im Standard-Zugriffsmodifikator:
- \n
- struct: Alle Member (Felder und Methoden) sind standardmäßig
public. \n - class: Alle Member sind standardmäßig
private. \n
Das war's. Es gibt keine weiteren Unterschiede auf Sprachebene. Keine Performance-Unterschiede, keine Magie. Nur die Zugänglichkeit. Schauen wir uns anhand von Beispielen an, wie das funktioniert.
\n\nBeispiel mit struct
\nstruct Point {\n int x;\n int y;\n};\n\n// Direkter Zugriff möglich\nPoint p;\np.x = 10;\np.y = 20;\n\nBeispiel mit class
\nclass Point {\n int x; // standardmäßig private!\n int y;\npublic:\n void setX(int val) { x = val; }\n void setY(int val) { y = val; }\n};\n\nPoint p;\n// p.x = 10; // Fehler! x ist private\np.setX(10); // So ist es erlaubt\n\nWie Sie sehen, liegt der Unterschied nur darin, wie Sie Daten „standardmäßig“ verstecken. Das bedeutet jedoch nicht, dass die Wahl zwischen class und struct Geschmackssache ist. Es gibt etablierte Praktiken.
\n\nWann struct wählen?
\n\nIn der C++-Community hat sich ein unausgesprochener Konsens gebildet: struct – für einfache Daten. Verwenden Sie struct, wenn Ihr Typ einfach eine Sammlung öffentlicher Felder ohne komplexe Logik ist. Klassische Beispiele:
\n\n- \n
- Koordinaten eines Punktes (
x, y) \n - Farbe in RGB (
r, g, b) \n - Konfiguration (
width, height, title) \n - Ergebnis einer Operation (
success, errorMessage) \n
In solchen Fällen müssen Daten nicht versteckt werden – sie sind ohnehin öffentlich. struct macht den Code sauberer und kürzer. Außerdem eignet sich struct hervorragend für POD-Typen (Plain Old Data) – Strukturen, die mit einfachem memcpy kopiert werden können.
Beispiel für die korrekte Verwendung von struct
\nstruct Vector2 {\n float x;\n float y;\n \n // Einfache Methoden können hinzugefügt werden\n float length() const {\n return std::sqrt(x*x + y*y);\n }\n};\n\n// Als einfacher Datencontainer verwenden\nVector2 v = {3.0f, 4.0f};\nstd::cout << v.length(); // 5.0\n\nBeachten Sie: Selbst wenn ein struct Methoden hat, ist das in Ordnung. Hauptsache, die Felder bleiben öffentlich und der Typ erfordert keine komplexe Invariantenlogik.
Wann class wählen?
\n\nClass ist die Standardwahl für vollwertige Objekte. Verwenden Sie class, wenn:
- \n
- Sie komplexe Logik haben, die Kapselung erfordert. \n
- Sie streng kontrollieren möchten, wie Daten geändert werden. \n
- Ihr Typ Invarianten hat (z. B. „Das Alter darf nicht negativ sein“). \n
- Sie Vererbung, virtuelle Funktionen oder Polymorphie verwenden. \n
Ein klassisches Beispiel ist die Klasse „Bankkonto“. Der Kontostand sollte nicht öffentlich sein, sonst könnte jemand versehentlich einen negativen Wert setzen.
\n\nBeispiel für die korrekte Verwendung von class
\nclass BankAccount {\nprivate:\n double balance;\n std::string owner;\n \npublic:\n BankAccount(const std::stri