Ich werde die vorhandenen Antworten ergänzen, da modernes C ++ jetzt eine Sache ist und offizielle Kernrichtlinien erstellt wurden, um bei Fragen wie diesen zu helfen.
Hier ist ein relevanter Abschnitt aus den Richtlinien:
C.2: Verwenden Sie die Klasse, wenn die Klasse eine Invariante hat. Verwenden Sie struct, wenn die Datenelemente unabhängig voneinander variieren können
Eine Invariante ist eine logische Bedingung für die Mitglieder eines Objekts, die ein Konstruktor festlegen muss, damit die Funktionen der öffentlichen Mitglieder sie übernehmen können. Nachdem die Invariante festgelegt wurde (normalerweise von einem Konstruktor), kann jede Elementfunktion für das Objekt aufgerufen werden. Eine Invariante kann informell (z. B. in einem Kommentar) oder formeller unter Verwendung von Expects angegeben werden.
Wenn alle Datenelemente unabhängig voneinander variieren können, ist keine Invariante möglich.
Wenn eine Klasse private Daten enthält, kann ein Benutzer ein Objekt ohne die Verwendung eines Konstruktors nicht vollständig initialisieren. Daher stellt der Klassendefinierer einen Konstruktor bereit und muss seine Bedeutung angeben. Dies bedeutet effektiv, dass der Definierer eine Invariante definieren muss.
Durchsetzung
Suchen Sie nach Strukturen mit allen privaten Daten und Klassen mit öffentlichen Mitgliedern.
Die angegebenen Codebeispiele:
struct Pair { // the members can vary independently
string name;
int volume;
};
// but
class Date {
public:
// validate that {yy, mm, dd} is a valid date and initialize
Date(int yy, Month mm, char dd);
// ...
private:
int y;
Month m;
char d; // day
};
Class
Es funktioniert gut für Mitglieder, die beispielsweise voneinander abgeleitet oder miteinander verbunden sind. Sie können auch bei der Überprüfung der geistigen Gesundheit nach der Instanziierung helfen. Struct
s eignen sich gut für "Datenbeutel", in denen nichts Besonderes vor sich geht, aber die Mitglieder logischerweise Sinn machen, wenn sie in Gruppen zusammengefasst werden.
Aus diesem Grund ist es sinnvoll, dass class
es zur Unterstützung der Kapselung und anderer verwandter Codierungskonzepte existiert, für die struct
s einfach nicht sehr nützlich sind.