Was sind die Unterschiede zwischen struct und class in C++?

Lesezeit: 10 Minuten

Was sind die Unterschiede zwischen struct und class in C
palm3D

Diese Frage wurde bereits im Zusammenhang mit C#/.Net gestellt.

Jetzt möchte ich die Unterschiede zwischen einer Struktur und einer Klasse in C++ lernen. Bitte diskutieren Sie die technischen Unterschiede sowie Gründe für die Wahl des einen oder anderen im OO-Design.

Ich beginne mit einem offensichtlichen Unterschied:

  • Wenn Sie nicht angeben public: oder private:, sind Mitglieder einer Struktur standardmäßig öffentlich; Mitglieder einer Klasse sind standardmäßig privat.

Ich bin sicher, dass es noch andere Unterschiede in den obskuren Ecken der C++-Spezifikation gibt.

  • Dies Verknüpfung fasst die Unterschiede gut zusammen.

    – sjsam

    7. November 2015 um 1:57 Uhr

  • Warum verwenden die Leute dann alle struct, um einen Baum zu bauen? Weil es scheint, dass der Unterschied nicht so groß ist. Übrigens, Dass ist eine großartige Website.@sjsam

    – JW.ZG

    10. Februar 2016 um 18:45 Uhr


  • Auf der Suche nach dem Unterschied zwischen struct in C und C++? Siehe hier.

    – März 2377

    9. März 2018 um 19:05 Uhr

  • @JW.ZG Nicht “alle” Leute tun das! Diejenigen, die das tun, ziehen es entweder einfach vor, oder wissen nicht, was struct bedeutet in C++. 😉 Aber es gibt keinen Grund, warum Sie die nicht verwenden können class Schlüsselwort stattdessen.

    – Leichtigkeitsrennen im Orbit

    14. Januar 2019 um 16:25 Uhr

Was sind die Unterschiede zwischen struct und class in C
Assaf Lavie

Sie vergessen den kniffligen zweiten Unterschied zwischen Klassen und Strukturen.

Zitieren Sie den Standard (§11.2.2 in C++98 bis C++11):

In Ermangelung einer Zugriffsbezeichner
für eine Basisklasse wird public angenommen, wenn die abgeleitete Klasse deklariert wird
Struktur und privat wird angenommen, wenn die Klasse deklariert wird Klasse.

Und nur der Vollständigkeit halber ist der bekanntere Unterschied zwischen Klasse und Struktur in (11.2) definiert:

Mitglied einer mit dem Schlüsselwort definierten Klasse Klasse sind Privat standardmäßig. Mit den Schlüsselwörtern definierte Mitglieder einer Klasse Struktur oder Union
sind öffentlich zugänglich standardmäßig.

Zusätzlicher Unterschied: das Schlüsselwort class kann verwendet werden, um Vorlagenparameter zu deklarieren, während die struct Schlüsselwort kann nicht so verwendet werden.

  • Das ist nicht wirklich ein zweiter Unterschied, es ist nur so, dass die Frage den Unterschied unvollständig angegeben hat. Alle Unterobjekte sind standardmäßig privat, wenn Sie die verwenden classöffentlich standardmäßig mit structund beide definieren einen Klassentyp.

    – Ben Voigt

    1. September 2011 um 23:45 Uhr

  • Ich glaube, Sie haben den Punkt verfehlt, Ben. Es ist die Vererbung, die für Strukturen öffentlich und für Klassen privat ist. Das ist eine sehr wichtige Unterscheidung, die nichts mit dem tatsächlichen Mitgliederzugriff zu tun hat. Beispielsweise hätte die Sprache es sehr gut anders definieren können, z. B. werden beide standardmäßig öffentlich vererbt, und Sie würden sehr unterschiedliche Implikationen erhalten.

    – Assaf Lavie

    2. September 2011 um 6:46 Uhr

  • Eigentlich das Echte knifflig Unterschied zwischen struct und class ist, dass letzteres anstelle von a verwendet werden kann typename um einen Vorlagenparameter zu deklarieren, ersteres kann dies nicht. :)

    – sbi

    18. Januar 2012 um 19:44 Uhr

  • @ MrUniverse: Das ist völlig falsch. (Es gibt eine Schule, die dies für eine Konvention verwendet, aber es wird nicht syntaktisch erzwungen.)

    – sbi

    29. Mai 2013 um 19:15 Uhr

  • @sbi “der wirklich knifflige Unterschied zwischen Struktur und Klasse” – Süß, aber die Frage betrifft den Unterschied zwischen ein Struktur und ein Klasse, nicht über Unterschiede, wo die Schlüsselwörter verwendet werden können.

    – Jim Balter

    10. Juni 2015 um 18:35 Uhr

Was sind die Unterschiede zwischen struct und class in C
Robᵩ

Zitieren Die C++-FAQ,

[7.8] Was ist der Unterschied zwischen den Schlüsselwörtern struct und class?

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

Struktur und Klasse sind ansonsten funktional gleichwertig.

OK, genug von diesem blitzsauberen Techno-Gerede. Emotional 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 mit sehr wenig Kapselung oder Funktionalität an. Eine Klasse fühlt sich 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 Leute bereits haben, sollten Sie wahrscheinlich das Schlüsselwort struct verwenden, wenn Sie eine Klasse haben, die sehr wenige Methoden und öffentliche Daten hat (solche Dinge gibt es in gut entworfenen Systemen!), aber ansonsten sollten Sie wahrscheinlich die Klasse verwenden Stichwort.

1647264016 890 Was sind die Unterschiede zwischen struct und class in C
Jon Hanna

Es lohnt sich, sich an die Ursprünge von C++ und die Kompatibilität mit C zu erinnern.

C hat Strukturen, es hat kein Konzept der Kapselung, also ist alles öffentlich.

Standardmäßig öffentlich zu sein, wird im Allgemeinen als schlechte Idee angesehen, wenn man einen objektorientierten Ansatz verfolgt, also eine Form von C zu erstellen, die OOP nativ förderlich ist (Sie können OO in C machen, aber es wird Ihnen nicht helfen), was die war Idee in C++ (ursprünglich “C With Classes”), ist es sinnvoll, Member standardmäßig privat zu machen.

Andererseits, wenn Stroustrup die Semantik geändert hätte struct so dass seine Mitglieder standardmäßig privat wären, hätte es die Kompatibilität gebrochen (es ist nicht mehr so ​​​​oft wahr, wie die Standards auseinandergingen, aber alle gültigen C-Programme waren auch gültige C++-Programme, was einen großen Einfluss darauf hatte, C++ Fuß zu fassen).

Also ein neues Stichwort class wurde eingeführt, um genau wie eine Struktur zu sein, aber standardmäßig privat.

Wenn C++ von Grund auf ohne Historie entstanden wäre, hätte es wahrscheinlich nur ein solches Schlüsselwort. Es hätte wahrscheinlich auch nicht die Wirkung gehabt, die es gemacht hat.

Im Allgemeinen neigen Leute dazu, struct zu verwenden, wenn sie etwas tun, wie Strukturen in C verwendet werden; öffentliche Member, kein Konstruktor (solange es sich nicht in einer Union befindet, you kann haben Konstruktoren in Strukturen, genau wie bei Klassen, aber die Leute neigen dazu, keine virtuellen Methoden usw. zu verwenden VM-Opcodes) ist es eine gute Idee, dabei zu bleiben.

  • Es ist wahrscheinlich auch erwähnenswert, dass es wahrscheinlich einfacher war, Klassen und Strukturen unter der Haube gleich funktionieren zu lassen, als sie grundlegend unterschiedlich zu sein. Im Nachhinein könnte es einen Vorteil gehabt haben, zB zu spezifizieren, dass alles, was als Struct deklariert wird, ein PODS sein muss (dh Structs verbieten, virtuelle Member, nicht-triviale Standardkonstruktoren oder -destruktoren usw. zu haben), aber so etwas hat meines Wissens nicht jemals von einem C++-Standard oder einer Implementierung verlangt wurde.

    – Superkatze

    16. Dezember 2013 um 17:25 Uhr

  • @supercat Die Tatsache, dass es sich um eine OO-Sprache handelte, in der ein riesiges Repertoire an Programmen, die in einer Nicht-OO-Sprache geschrieben wurden, gültige Programme waren, brachte das Konzept in den Vordergrund, und es scheint dort mehr aufzutauchen als in reineren OO-Sprachen (und ist natürlich tatsächlich im Standard definiert). Die Geschichte des frühen C++ erklärt definitiv viel darüber. Stroustrups “The Design and Evolution of C++” ist eine interessante Lektüre.

    – Jon Hanna

    16. Dezember 2013 um 21:08 Uhr

  • Ich nehme einen religiösen Krieg wahr zwischen Menschen, die der Meinung sind, dass alles, was nicht “oop-ish” ist, es sein sollte, und denen, die denken, dass OOP als OOP angesehen werden sollte ein Werkzeug, aber nicht der Werkzeug. C++ scheint sicherlich die letztere Philosophie zu übernehmen, aber ich weiß wirklich nicht viel über Sprachen davor. Meine eigene Philosophie ist, dass man, wenn man ein Objekt haben möchte, ein Objekt verwenden sollte, und wenn man eine Aggregation verwandter, aber unabhängiger Variablen haben möchte, sollte man dieses verwenden. C++ macht keinen syntaktischen Unterschied zwischen solchen Dingen, und .NET versucht, diese Unterscheidung zu verwischen, aber das Wenige, das ich über D weiß …

    – Superkatze

    16. Dezember 2013 um 22:06 Uhr

  • … deutet darauf hin, dass es besser als C++ oder .NET erkannt wird. Aggregationen von Variablen sind nicht gerade OOPish, aber das bedeutet nicht, dass sie nicht verwendet werden sollten, wenn sie es sind sinnvoll.

    – Superkatze

    16. Dezember 2013 um 22:10 Uhr

  • Ich bin nicht einverstanden mit “C hat Strukturen, es hat kein Konzept der Kapselung, also ist alles öffentlich.” Sie können eine Definition von a ausblenden struct in einem *.c– Datei ablegen und andere Übersetzungseinheiten nur mit einem Zeiger verwenden lassen. So hat man eine noch stärkere Kapselung, weil andere Übersetzungseinheiten gar nicht wissen, was drin ist struct.

    – 12431234123412341234123

    8. Mai 2017 um 11:35 Uhr

1647264016 721 Was sind die Unterschiede zwischen struct und class in C
Kasprzol

Die Mitglieder der Klasse sind standardmäßig privat. Die Mitglieder von Struct sind standardmäßig öffentlich. Ansonsten gibt es keine weiteren Unterschiede. Siehe auch diese Frage.

Laut Stroustrup in der Programmiersprache C++:

Welchen Stil Sie verwenden, hängt von den Umständen und dem Geschmack ab. Ich benutze meistens lieber struct für Klassen, die alle Daten öffentlich haben. Ich denke an solche Klassen als “nicht ganz richtige Typen, nur Datenstrukturen”.

Funktional gibt es keinen Unterschied außer öffentlich/privat

  • Welcher Unterschied? Bitte erkläre.

    – crashmstr

    16. Juni 2009 um 12:33 Uhr

1647264016 742 Was sind die Unterschiede zwischen struct und class in C
dgellow

  1. Mitglieder einer Klasse sind standardmäßig privat und Mitglieder von struct sind standardmäßig öffentlich.

Beispielsweise schlägt Programm 1 bei der Kompilierung fehl und Programm 2 funktioniert einwandfrei.

// Program 1
#include <stdio.h>
 
class Test {
    int x; // x is private
};

int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}
// Program 2
#include <stdio.h>
 
struct Test {
    int x; // x is public
};

int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}
  1. Beim Ableiten einer Struktur von einer Klasse/Struktur, Der Standard-Zugriffsbezeichner für eine Basisklasse/Struktur ist öffentlich. Und beim Ableiten einer Klasse Der Standardzugriffsbezeichner ist privat.

Beispielsweise schlägt Programm 3 bei der Kompilierung fehl und Programm 4 funktioniert einwandfrei.

// Program 3
#include <stdio.h>
 
class Base {
public:
    int x;
};
 
class Derived : Base { }; // is equivalent to class Derived : private Base {}
 
int main()
{
  Derived d;
  d.x = 20; // compiler error because inheritance is private
  getchar();
  return 0;
}
// Program 4
#include <stdio.h>
 
class Base {
public:
    int x;
};
 
struct Derived : Base { }; // is equivalent to struct Derived : public Base {}
 
int main()
{
  Derived d;
  d.x = 20; // works fine because inheritance is public
  getchar();
  return 0;
}

  • Welcher Unterschied? Bitte erkläre.

    – crashmstr

    16. Juni 2009 um 12:33 Uhr

1647264017 411 Was sind die Unterschiede zwischen struct und class in C
64BitBob

STRUCT ist eine Art abstrakter Datentyp, der einen bestimmten Speicherabschnitt gemäß der Strukturspezifikation aufteilt. Strukturen sind besonders nützlich bei der Dateiserialisierung/-deserialisierung, da die Struktur oft wörtlich in die Datei geschrieben werden kann. (dh einen Zeiger auf die Struktur erhalten, das SIZE-Makro verwenden, um die Anzahl der zu kopierenden Bytes zu berechnen, und dann die Daten in die Struktur hinein oder aus ihr heraus verschieben.)

Klassen sind eine andere Art von abstrakten Datentypen, die versuchen, das Verbergen von Informationen sicherzustellen. Intern kann es eine Vielzahl von Machenschaften, Methoden, temporären Variablen, Zustandsvariablen geben. usw., die alle verwendet werden, um jedem Code, der die Klasse verwenden möchte, eine konsistente API zu präsentieren.

Tatsächlich geht es bei Strukturen um Daten, bei Klassen um Code.

Sie müssen jedoch verstehen, dass dies nur Abstraktionen sind. Es ist durchaus möglich, Strukturen zu erstellen, die stark wie Klassen aussehen, und Klassen, die stark wie Strukturen aussehen. Tatsächlich waren die frühesten C++-Compiler lediglich Vorcompiler, die C++-Code in C übersetzen. Daher sind diese Abstraktionen ein Vorteil für das logische Denken, nicht unbedingt eine Bereicherung für den Computer selbst.

Neben der Tatsache, dass es sich bei jeder um eine andere Art von Abstraktion handelt, bieten Klassen Lösungen für das Rätsel der C-Codebenennung. Da Sie nicht mehr als eine Funktion mit demselben Namen verfügbar machen können, folgten Entwickler früher einem Muster von _(). zB mathlibextreme_max(). Durch die Gruppierung von APIs in Klassen können ähnliche Funktionen (hier nennen wir sie “Methoden”) zusammen gruppiert und vor der Benennung von Methoden in anderen Klassen geschützt werden. Dies ermöglicht dem Programmierer, seinen Code besser zu organisieren und die Wiederverwendung von Code zu erhöhen. Theoretisch zumindest.

  • Dies ist das Unauffälligste an Strukturen und Klassen. „Bei Strukturen geht es um Daten, bei Klassen um Code“ kann umformuliert werden als „Bei Strukturen geht es um Daten, bei Klassen um Daten, Sicherheit und Operationen, die mit diesen Daten ausgeführt werden“

    – Arun Aravind

    28. Dezember 2014 um 11:06 Uhr

  • Es ist nicht möglich, eine Struktur in C++ zu erstellen. Es ist nur möglich, eine Klasse mit dem geerbten zu erstellen struct Stichwort.

    – Leichtigkeitsrennen im Orbit

    2. August 2016 um 12:24 Uhr

  • Bei dieser Antwort scheint es nicht um C++ zu gehen. In C++, struct deklariert Klassen (inkl public/private/protectedErbschaft usw.).

    – Melpomen

    3. Oktober 2017 um 4:54 Uhr

  • Wie werden Strukturen abstrakt? Das Schreiben von Rohstrukturen in eine Datei ist selbst in C mit Problemen behaftet (die üblichen Probleme umfassen Auffüllen, Endianness, unterschiedliche Wortgröße usw.). Was ist das SIZE Makro, von dem du sprichst?

    – Melpomen

    3. Oktober 2017 um 4:56 Uhr

1001690cookie-checkWas sind die Unterschiede zwischen struct und class in C++?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy