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?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.
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.
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.
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.
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üsselstruct
yprivate
wird angenommen, wenn die Klasse mit der Option klasse-schlüsselclass
.
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 dasunion
klasse-schlüssel wird verwendet, um sich auf eineunion
(11.5), und entweder dieclass
ostruct
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üsselclass
.
...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.