In welchen Szenarien ist es besser, eine struct
gegen ein class
in C++?
- Was sind die Unterschiede zwischen struct und class in C++? (30 Antworten )
Antworten
Zu viele Anzeigen?Die Unterschiede zwischen einer class
und eine struct
in C++ ist:
struct
Mitglieder und Basisklassen/-strukte sindpublic
standardmäßig.class
Mitglieder und Basisklassen/Streben sindprivate
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 nutzenprivate
oprotected
Mitglieder, nicht standardmäßige Konstruktoren und Operatoren, usw.
Wie alle anderen feststellen, gibt es eigentlich nur zwei tatsächliche sprachliche Unterschiede:
struct
standardmäßig auf öffentlichen Zugang undclass
ist standardmäßig auf privaten Zugang eingestellt.- Beim Vererben,
struct
wird standardmäßig aufpublic
Vererbung undclass
wird standardmäßig aufprivate
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++? )
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
.
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());
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.
- See previous answers
- Weitere Antworten anzeigen