1289 Stimmen

Wann sollte man in C++ eine Klasse und wann eine Struktur verwenden?

In welchen Szenarien ist es besser, eine struct gegen ein class in C++?

5voto

enigmatic Punkte 295

Sie sind so ziemlich das Gleiche. Dank der Magie von C++ kann eine Struktur Funktionen enthalten, Vererbung nutzen, mit "new" erstellt werden und so weiter, genau wie eine Klasse

Der einzige funktionale Unterschied besteht darin, dass eine Klasse mit privaten Zugriffsrechten beginnt, während eine Struktur mit öffentlichen beginnt. Damit wird die Abwärtskompatibilität mit C gewahrt.

In der Praxis habe ich immer Structs als Datenhalter und Klassen als Objekte verwendet.

4voto

farhan Punkte 458

Klasse.

Klassenmitglieder sind standardmäßig privat.

class test_one {
    int main_one();
};

Ist gleichbedeutend mit

class test_one {
  private:
    int main_one();
};

Wenn Sie also versuchen

int two = one.main_one();

Wir erhalten eine Fehlermeldung: main_one is private weil es nicht zugänglich ist. Wir können lösen, indem wir sie initialisieren, indem wir angeben, dass sie ein öffentliches ie

class test_one {
  public:
    int main_one();
};

Struktur.

Eine Struktur ist eine Klasse, deren Mitglieder standardmäßig öffentlich sind.

struct test_one {
    int main_one;
};

Bedeutet main_one ist privat, d.h.

class test_one {
  public:
    int main_one;
};

Ich verwende Structs für Datenstrukturen, bei denen die Mitglieder jeden beliebigen Wert annehmen können, es ist einfacher.

3voto

anio Punkte 8423

Strukturen haben standardmäßig öffentlichen Zugriff und Klassen haben standardmäßig privaten Zugriff.

Ich persönlich verwende Structs für Datenübertragungsobjekte oder als Wertobjekte. Wenn ich sie als solche verwende, deklariere ich alle Mitglieder als const, um Änderungen durch anderen Code zu verhindern.

3voto

Javier Punkte 58737

Sie sind dasselbe mit unterschiedlichen Standardeinstellungen (standardmäßig privat für class und standardmäßig öffentlich für struct ), so dass sie theoretisch völlig austauschbar sind.

Wenn ich also nur einige Informationen verpacken möchte, um sie zu verschieben, verwende ich eine Struktur, auch wenn ich dort ein paar Methoden einfüge (aber nicht viele). Wenn es sich um eine größtenteils undurchsichtige Sache handelt, bei der die Hauptnutzung über Methoden und nicht direkt auf die Datenelemente erfolgt, verwende ich eine vollständige Klasse.

3voto

Tony Delroy Punkte 98528

Um dies aus der Perspektive des C++20-Standards zu betrachten (ausgehend von N4860 )...

A Klasse ist ein Typ. Die Schlüsselwörter " class " und " struct " (und " union ") sind - in der C++-Grammatik - klasse-schlüssel s, und die einzige funktionale Bedeutung der Wahl von class o struct ist:

En klasse-schlüssel bestimmt, ob ... der Zugang standardmäßig öffentlich oder privat ist (11.9).

Standardzugänglichkeit der Datenmitglieder

Dass die class Schlüsselwort "private-by-default" zu "private-by-default"-Mitgliedern und das Schlüsselwort "construct" zu "public-by-default"-Mitgliedern führt, ist in den Beispielen in 11.9.1 dokumentiert:

Klasse X { int a; // X::a ist standardmäßig privat: Klasse verwendet

...gegen...

Struktur S { int a; // S::a ist standardmäßig öffentlich: struct verwendet

Standardzugänglichkeit der Basisklasse

1.9 sagt auch:

In Ermangelung einer Zugangsspezifikation für eine Basisklasse, public wird angenommen, wenn die abgeleitete Klasse mit der Option klasse-schlüssel struct y private wird angenommen, wenn die Klasse mit der Option klasse-schlüssel class .

Umstände, unter denen eine konsistente Verwendung von Struktur oder Klasse erforderlich ist...

Es gibt eine Bedingung:

Bei einer Neudeklaration, partiellen Spezialisierung, expliziten Spezialisierung oder expliziten Instanziierung einer Klassenvorlage wird die klasse-schlüssel muss in der Art mit der ursprünglichen Klassenvorlagendeklaration übereinstimmen (9.2.8.3).

...in jedem ausgearbeiteter Typ-Spezifikator le enum Schlüsselwort verwendet werden, um auf eine Aufzählung zu verweisen (9.7.1), muss das union klasse-schlüssel wird verwendet, um sich auf eine union (11.5), und entweder die class o struct klasse-schlüssel werden für eine nicht gewerkschaftlich organisierte Klasse verwendet (11.1).

Das folgende Beispiel (für den Fall, dass die Konsistenz no erforderlich) ist vorgesehen:

struct S { } s; Klasse S* p = &s; // OK

Einige Compiler warnen jedoch vor diesem Problem.


Interessant ist, dass die Typen, die Sie mit struct , class y union werden alle als "Klassen" bezeichnet, wir haben...

A Standard-Layout-Struktur ist eine Standard-Layoutklasse, die mit der klasse-schlüssel struct oder die klasse-schlüssel class .

...also in der Standardsprache, wenn es um eine Standard-Layout-Struktur es wird "struct" verwendet, um "nicht eine Gewerkschaft" zu implizieren.

Ich bin neugierig, ob es ähnliche Verwendungen von "struct" in anderer Terminologie gibt, aber es ist eine zu große Aufgabe, eine erschöpfende Suche im Standard durchzuführen. Kommentare dazu sind willkommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X