Klasse oder Struktur in C++: Wann was wählen? Analyse der Kernfrage

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Klasse oder Struktur in C++: Die ewige Debatte

\n\n

Stellen 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\n

In 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!

\n\n

Der Hauptunterschied: Standard-Zugriffsmodifikatoren

\n\n

Wenn 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\n
    \n
  • struct: Alle Member (Felder und Methoden) sind standardmäßig public.
  • \n
  • class: Alle Member sind standardmäßig private.
  • \n
\n\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\n

Beispiel mit struct

\n
struct Point {\n    int x;\n    int y;\n};\n\n// Direkter Zugriff möglich\nPoint p;\np.x = 10;\np.y = 20;
\n\n

Beispiel mit class

\n
class 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\n

Wie 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\n

Wann struct wählen?

\n\n

In 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
\n\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.

\n\n

Beispiel für die korrekte Verwendung von struct

\n
struct 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\n

Beachten Sie: Selbst wenn ein struct Methoden hat, ist das in Ordnung. Hauptsache, die Felder bleiben öffentlich und der Typ erfordert keine komplexe Invariantenlogik.

\n\n

Wann class wählen?

\n\n

Class ist die Standardwahl für vollwertige Objekte. Verwenden Sie class, wenn:

\n\n
    \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
\n\n

Ein klassisches Beispiel ist die Klasse „Bankkonto“. Der Kontostand sollte nicht öffentlich sein, sonst könnte jemand versehentlich einen negativen Wert setzen.

\n\n

Beispiel für die korrekte Verwendung von class

\n
class BankAccount {\nprivate:\n    double balance;\n    std::string owner;\n    \npublic:\n    BankAccount(const std::stri                

Blogs

Buchempfehlungen