1272 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++?

1105voto

Commodore Jaeger Punkte 30016

Die Unterschiede zwischen einer class und eine struct in C++ ist:

  • struct Mitglieder und Basisklassen/-strukte sind public standardmäßig.
  • class Mitglieder und Basisklassen/Streben sind private standardmäßig.

Sowohl Klassen als auch Strukturen können eine Mischung aus public , protected y private Mitglieder, können Vererbung verwenden und können Mitgliedsfunktionen haben.

Ich würde Sie empfehlen:

  • verwenden. struct für einfache alte Datenstrukturen ohne klassenähnliche Merkmale;
  • verwenden. class wenn Sie Funktionen wie die folgenden nutzen private o protected Mitglieder, nicht standardmäßige Konstruktoren und Operatoren, usw.

292voto

quark Punkte 14920

Wie alle anderen feststellen, gibt es eigentlich nur zwei tatsächliche sprachliche Unterschiede:

  • struct standardmäßig auf öffentlichen Zugang und class ist standardmäßig auf privaten Zugang eingestellt.
  • Beim Vererben, struct wird standardmäßig auf public Vererbung und class wird standardmäßig auf private Vererbung. (Ironischerweise ist, wie bei so vielen Dingen in C++, die Voreinstellung rückwärts gerichtet: public Die Vererbung ist bei weitem die häufigste Wahl, aber die Menschen geben selten eine Erklärung ab. struct s nur, um sich die Eingabe des " public Schlüsselwort".

Der eigentliche Unterschied in der Praxis besteht jedoch zwischen einer class / struct die einen Konstruktor/Destruktor deklariert und eine, die das nicht tut. Es gibt bestimmte Garantien für einen POD-Typ, die nicht mehr gelten, wenn Sie die Konstruktion der Klasse übernehmen. Um diese Unterscheidung klar zu halten, verwenden viele Leute absichtlich nur struct s für POD-Typen und, wenn sie überhaupt Methoden hinzufügen wollen, verwenden sie class es. Der Unterschied zwischen den beiden folgenden Fragmenten ist ansonsten bedeutungslos:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Übrigens gibt es hier einen Thread mit einigen guten Erklärungen darüber, was "POD-Typ" eigentlich bedeutet: Was sind POD-Typen in C++? )

282voto

In den vorliegenden Antworten sind viele falsche Vorstellungen enthalten.

Beide class y struct eine Klasse deklarieren.

Ja, es kann sein, dass Sie Ihre zugriffsändernden Schlüsselwörter innerhalb der Klassendefinition neu anordnen müssen, je nachdem, welches Schlüsselwort Sie zur Deklaration der Klasse verwendet haben.

Aber über die Syntax hinaus ist die nur Grund für die Entscheidung für das eine oder das andere ist die Konvention/der Stil/die Vorliebe.

Manche Menschen halten sich gerne an die struct Schlüsselwort für Klassen ohne Mitgliedsfunktionen, weil die resultierende Definition "wie" eine einfache Struktur aus C aussieht.

In ähnlicher Weise verwenden manche Leute gerne die class Schlüsselwort für Klassen mit Mitgliedsfunktionen und private Daten, weil da "Klasse" draufsteht und sie deshalb wie Beispiele aus ihrem Lieblingsbuch über objektorientierte Programmierung aussehen.

Die Realität ist, dass dies völlig von Ihnen und Ihrem Team abhängt, und es wird buchstäblich keinen Unterschied für Ihr Programm machen.

Die beiden folgenden Klassen sind in jeder Hinsicht gleichwertig, mit Ausnahme ihres Namens:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Sie können bei der Neuanmeldung sogar die Schlüsselwörter wechseln:

class Foo;
struct Bar;

(obwohl Visual Studio-Builds werden dadurch unterbrochen aufgrund von Nichtkonformität, so dass der Compiler eine Warnung ausgibt, wenn Sie dies tun).

und die folgenden Ausdrücke ergeben beide den Wert true:

std::is_class<Foo>::value
std::is_class<Bar>::value

Beachten Sie jedoch, dass Sie die Schlüsselwörter nicht wechseln können, wenn Neudefinition von Dies liegt nur daran, dass (gemäß der Ein-Definitions-Regel) doppelte Klassendefinitionen in Übersetzungseinheiten "aus der gleichen Abfolge von Token bestehen" . Das heißt, Sie können nicht einmal umtauschen const int member; avec int const member; und hat nichts zu tun mit der Semantik von class o struct .

56voto

Ferruccio Punkte 96076

Das einzige Mal, dass ich eine Struktur anstelle einer Klasse verwende, ist, wenn ich einen Funktor deklariere, bevor ich ihn in einem Funktionsaufruf verwende, und die Syntax aus Gründen der Übersichtlichkeit minimieren möchte. z.B.:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare());

42voto

Tal Pressman Punkte 7113

Desde el C++ FAQ Lite :

Die Mitglieder und Basisklassen einer Struktur sind standardmäßig öffentlich, während sie in Klassen standardmäßig privat sind. Hinweis: Sie sollten Ihre Basisklassen ausdrücklich öffentlich, privat oder geschützt machen, anstatt sich auf die Standardwerte zu verlassen.

struct und class sind ansonsten funktional gleichwertig.

OK, genug von diesem blitzsauberen Techno-Gerede. Gefühlsmäßig machen die meisten Entwickler einen starken Unterschied zwischen einer Klasse und einer Struktur. Eine Struktur fühlt sich einfach wie ein offener Haufen von Bits an, mit sehr wenig in der Art von Kapselung oder Funktionalität. Eine Klasse fühlt sich an wie ein lebendiges und verantwortungsbewusstes Mitglied der Gesellschaft mit intelligenten Diensten, einer starken Kapselungsbarriere und einer gut definierten Schnittstelle. Da dies die Konnotation ist, die die meisten Menschen bereits haben, sollten Sie wahrscheinlich das Schlüsselwort struct verwenden, wenn Sie eine Klasse haben, die nur wenige Methoden und öffentliche Daten hat (solche Dinge gibt es in gut entworfenen Systemen!), aber ansonsten sollten Sie wahrscheinlich das Schlüsselwort class verwenden.

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