it-swarm.com.de

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

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 besprechen Sie die technischen Unterschiede sowie die Gründe für die Wahl des einen oder anderen in OO design.

Ich beginne mit einem offensichtlichen Unterschied:

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

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

420
palm3D

Sie vergessen den kniffligen zweiten Unterschied zwischen Klassen und Strukturen.

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

In Abwesenheit eines Zugriffsspezifizierer für eine Basisklasse wird public angenommen, wenn die abgeleitete Klasse als struct deklariert wird, und private wird angenommen, wenn die Klasse als class deklariert wird.

Der Vollständigkeit halber wird der bekanntere Unterschied zwischen Klasse und Struktur in (11.2) definiert:

Mitglieder einer Klasse, die mit dem Schlüsselwort class definiert wurden, sind standardmäßig private. Mitglieder einer Klasse, die mit den Schlüsselwörtern struct oder nion definiert wurden, sind standardmäßig public.

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

453
Assaf Lavie

Zitieren Die C++ FAQ ,

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

Die Member 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 Standardeinstellungen zu verlassen.

Struktur und Klasse sind ansonsten funktional gleichwertig.

Okay, genug von diesem blitzsauberen Technogespräch. Emotional unterscheiden die meisten Entwickler stark zwischen einer Klasse und einer Struktur. Eine Struktur fühlt sich einfach wie ein offener Haufen von Bits an, der nur sehr wenig Einkapselung oder Funktionalität bietet. Eine Klasse fühlt sich wie ein lebendiges und verantwortungsbewusstes Mitglied der Gesellschaft mit intelligenten Diensten, einer starken Einkapselungsbarriere und einer klar 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 nur sehr wenige Methoden und öffentliche Daten enthält (solche Dinge gibt es in gut entworfenen Systemen!), Aber ansonsten sollten Sie wahrscheinlich die Klasse verwenden Stichwort.

159
Robᵩ

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 ein objektorientierter Ansatz gewählt wird. Wenn Sie also eine Form von C erstellen, die von Haus aus OOP (Sie können OO in C, aber es wird Ihnen nicht helfen) Was die Idee in C++ (ursprünglich "C mit Klassen") war, ist es sinnvoll, Mitglieder standardmäßig privat zu machen.

Wenn Stroustrup dagegen die Semantik von struct so geändert hätte, dass seine Mitglieder standardmäßig privat sind, hätte dies eine fehlerhafte Kompatibilität zur Folge (dies trifft nicht mehr so ​​oft zu, wie die Standards abweichen, sondern alle gültigen C-Programme waren auch gültige C++ - Programme, die einen großen Einfluss darauf hatten, C++ Fuß zu fassen).

Daher wurde das neue Schlüsselwort class eingeführt, das genau wie eine Struktur aussieht, jedoch standardmäßig privat ist.

Wenn C++ von Grund auf neu und ohne Verlauf erstellt worden wäre, hätte es wahrscheinlich nur ein solches Schlüsselwort. Es hätte wahrscheinlich auch nicht den Eindruck hinterlassen, den es hinterließ.

Im Allgemeinen tendieren die Benutzer dazu, struct zu verwenden, wenn sie etwas tun, wie Strukturen in C verwendet werden. Öffentliche Mitglieder, kein Konstruktor (solange er nicht in einer Union ist, kann man Konstruktoren in Strukturen haben , genau wie bei Klassen, aber die Leute neigen dazu nicht zu), keine virtuellen Methoden, etc. Da Sprachen so viel für die Kommunikation mit den Lesern des Codes sind, wie für die Instruktion von Maschinen (oder wir würden uns an Assembly halten und rohen VM= Opcodes) ist es eine gute Idee dabei zu bleiben.

118
Jon Hanna

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 .

31
Kasprzol

Laut Stroustrup in der C++ - Programmiersprache :

Welchen Stil Sie verwenden, hängt von den Umständen und dem Geschmack ab. Normalerweise bevorzuge ich die Verwendung von struct für Klassen, bei denen alle Daten öffentlich sind. Ich denke an Klassen wie "nicht ganz richtige Typen, nur Datenstrukturen".

Funktionell gibt es keinen anderen Unterschied als das öffentliche/private

28
crashmstr

STRUCT ist eine Art abstrakter Datentyp, der einen bestimmten Speicherblock gemäß der Strukturspezifikation aufteilt. Strukturen sind besonders nützlich bei der Serialisierung/Deserialisierung von Dateien, da die Struktur häufig wörtlich in die Datei geschrieben werden kann. (d. h. Sie erhalten einen Zeiger auf die Struktur, verwenden das Makro SIZE, um die Anzahl der zu kopierenden Bytes zu berechnen, und verschieben dann die Daten in die Struktur oder aus der Struktur heraus.)

Klassen sind ein anderer abstrakter Datentyp, der versucht, das Ausblenden von Informationen sicherzustellen. Intern kann es eine Vielzahl von Bearbeitungen, Methoden, temporären Variablen und Zustandsvariablen geben. usw., die alle verwendet werden, um jedem Code, der die Klasse verwenden möchte, eine konsistente API zu präsentieren.

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

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

Abgesehen von der Tatsache, dass jede Abstraktion eine andere Art von Abstraktion ist, bieten Klassen Lösungen für das C-Code-Namensrätsel. Da nicht mehr als eine Funktion mit demselben Namen verfügbar gemacht werden kann, folgten die Entwickler einem Muster von _ (). z.B. mathlibextreme_max (). Durch Gruppieren von APIs in Klassen können ähnliche Funktionen (hier als "Methoden" bezeichnet) zusammengefasst und vor der Benennung von Methoden in anderen Klassen geschützt werden. Dies ermöglicht es dem Programmierer, seinen Code besser zu organisieren und die Wiederverwendung von Code zu erhöhen. Zumindest theoretisch.

10
64BitBob

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

Zum Beispiel 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;
}
Run on IDE
// 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;
}

2) Wenn eine Struktur von einer Klasse/Struktur abgeleitet wird, ist der Standardzugriffsspezifizierer für eine Basisklasse/Struktur öffentlich. Und beim Ableiten einer Klasse ist der Standardzugriffsbezeichner privat.

Zum Beispiel 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 equilalent to class Derived : private Base {}

int main()
{
  Derived d;
  d.x = 20; // compiler error becuase inheritance is private
  getchar();
  return 0;
}
Run on IDE
// Program 4
#include <stdio.h>

class Base {
public:
    int x;
};

struct Derived : Base { }; // is equilalent to struct Derived : public Base {}

int main()
{
  Derived d;
  d.x = 20; // works fine becuase inheritance is public
  getchar();
  return 0;
}
10
Suraj K Thomas

Der einzige andere Unterschied ist die standardmäßige Vererbung von Klassen und Strukturen, die, was nicht überraschend ist, privat bzw. öffentlich ist.

8
Skizz
  1. Die Mitglieder einer Struktur sind standardmäßig öffentlich, die Mitglieder der Klasse sind standardmäßig privat.
  2. Die Standardvererbung für die Struktur einer anderen Struktur oder Klasse ist public. Die Standardvererbung für die Klasse einer anderen Struktur oder Klasse ist private.
class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

Dies ist auf VS2005.

4
GirishNayak

Wenn Sie eine ältere App mit Strukturen zur Verwendung von Klassen aktualisiert haben, tritt möglicherweise das folgende Problem auf:

Alter Code hat Strukturen, Code wurde bereinigt und in Klassen geändert. Ein oder zwei virtuelle Funktionen wurden dann zu der neuen aktualisierten Klasse hinzugefügt.

Wenn sich virtuelle Funktionen in Klassen befinden, fügt der Compiler intern einen zusätzlichen Zeiger auf die Klassendaten hinzu, um auf die Funktionen zu verweisen.

Wenn im alten Code irgendwo die Struktur mit memfill gelöscht wird, um alle Werte auf Null zu setzen, werden auch die zusätzlichen Zeigerdaten gestoppt.

4
KPexEA

Nicht in der Spezifikation, nein. Der Hauptunterschied liegt in den Erwartungen der Programmierer, wenn sie Ihren Code in 2 Jahren lesen. Es wird oft angenommen, dass Strukturen POD sind. Strukturen werden auch bei der Template-Metaprogrammierung verwendet, wenn Sie einen Typ für andere Zwecke als zum Definieren von Objekten definieren.

4
MSalters
  1. Mitglieder einer Klasse, die mit dem Schlüsselwort class definiert wurden, sind standardmäßig private. Mitglieder einer Klasse, die mit den Schlüsselwörtern struct (oder union) definiert wurden, sind standardmäßig public.

  2. In Abwesenheit eines Zugriffsspezifizierers für eine Basisklasse wird public angenommen, wenn die abgeleitete Klasse struct deklariert wird, und private wird angenommen, wenn die Klasse wird als class deklariert.

  3. Sie können einen enum class, Aber keinen enum struct Deklarieren.

  4. Sie können template<class T> Aber nicht template<struct T> Verwenden.

Beachten Sie auch, dass Sie mit dem C++ - Standard einen Typ als struct deklarieren und dann class verwenden können, wenn Sie den Typ deklarieren und umgekehrt. Außerdem ist std::is_class<Y>::valuetrue, wenn Y ein struct und ein class ist, aber false für einen enum class .

3
Bathsheba

Ein weiterer Hauptunterschied betrifft Vorlagen. Soweit ich weiß, können Sie eine Klasse verwenden, wenn Sie eine Vorlage definieren, aber keine Struktur.

template<class T> // OK
template<struct T> // ERROR, struct not allowed here
3
Stefan Popescu

Es ist nur eine Konvention. Es können Strukturen erstellt werden, die einfache Daten enthalten, aber später durch Hinzufügen von Elementfunktionen und Konstruktoren weiterentwickelt werden. Auf der anderen Seite ist es ungewöhnlich, etwas anderes als öffentlich zu sehen: Zugriff in einer Struktur.

2
finnw

ISO IEC 14882-2003

9 Klassen

§3

Eine Struktur ist eine Klasse, die mit dem Klassenschlüssel struct definiert wird. Seine Mitglieder und Basisklassen (Klausel 10) sind standardmäßig öffentlich (Klausel 11).

2
Gregory Pakosz

Hier ist eine gute Erklärung: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

Noch einmal: In C++ ist eine Struktur mit einer Klasse identisch, mit der Ausnahme, dass die Mitglieder einer Struktur standardmäßig öffentlich sichtbar sind, während die Mitglieder einer Klasse standardmäßig privat sichtbar sind.

2
nutario
  • . In Klassen sind standardmäßig alle Mitglieder privat, in Strukturmitgliedern jedoch standardmäßig öffentlich.

    1. Es gibt keinen Begriff wie Konstruktor und Destruktor für Strukturen, aber für Klassen erstellt der Compiler einen Standardwert, wenn Sie ihn nicht angeben.

    2. Die Größe der leeren Struktur ist 0 Byte. Die Größe der leeren Klasse ist 1 Byte. Der Standardzugriffstyp der Struktur ist public. Eine Struktur sollte normalerweise zum Gruppieren von Daten verwendet werden.

    Der Standardzugriffstyp der Klasse ist privat, und der Standardmodus für die Vererbung ist privat. Eine Klasse sollte zum Gruppieren von Daten und Methoden verwendet werden, die mit diesen Daten arbeiten.

    Kurz gesagt besteht die Konvention darin, struct zu verwenden, wenn der Zweck darin besteht, Daten zu gruppieren, und Klassen zu verwenden, wenn Datenabstraktion und möglicherweise Vererbung erforderlich sind.

    In C++ werden Strukturen und Klassen als Wert übergeben, sofern nicht ausdrücklich anders angegeben. In anderen Sprachen können Klassen und Strukturen unterschiedliche Semantiken haben - d. H. Objekte (Instanzen von Klassen) können als Referenz übergeben werden und Strukturen können als Wert übergeben werden. Hinweis: Zu dieser Frage gibt es Kommentare. Siehe die Diskussionsseite, um sie der Konversation hinzuzufügen.

1
yshivakathik

Der Unterschied zwischen class und struct ist ein Unterschied zwischen Schlüsselwörtern, nicht zwischen Datentypen. Diese zwei

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

beide definieren einen Klassentyp. Der Unterschied der Schlüsselwörter in diesem Zusammenhang ist der unterschiedliche Standardzugriff:

  • foo::x ist öffentlich und foo_base wird öffentlich geerbt
  • bar::x ist privat und bar_base wird privat vererbt

Während andere Antworten implizieren, wird nicht explizit erwähnt, dass Strukturen je nach Verwendung C-kompatibel sind. Klassen sind nicht.

Wenn Sie also einen Header schreiben, der C-kompatibel sein soll, haben Sie keine andere Option als struct (die in der C-Welt keine Funktionen haben kann, aber Funktionszeiger).

1
UKMonkey

Die anderen Antworten haben die privaten/öffentlichen Standardeinstellungen erwähnt (beachten Sie jedoch, dass eine Struktur eine Klasse ist; es handelt sich nicht um zwei verschiedene Elemente, sondern nur um zwei Möglichkeiten, dasselbe Element zu definieren).

Interessant zu bemerken ist, dass Visual C++ unter bestimmten Umständen eine Beschwerde erhebt, wenn eine Klasse mit class deklariert und dann mit struct (oder möglicherweise umgekehrt), obwohl der Standard besagt, dass dies vollkommen legal ist.

1
ymett