Was sind die Unterschiede zwischen Struktur und Klasse in C ++?


439

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 im OO-Design.

Ich werde mit einem offensichtlichen Unterschied beginnen:

  • Wenn Sie nicht angeben , public:oder die 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 andere Unterschiede gibt.


6
Dieser Link fasst die Unterschiede gut zusammen.
Sjsam

1
Warum benutzen die Leute dann alle Struktur, um einen Baum zu bauen? Weil es scheint, dass der Unterschied nicht so groß ist. Übrigens, das ist eine großartige Website. @ Sjsam
JW.ZG

1
Suchen Sie nach dem Unterschied zwischen structC und C ++? Siehe hier .
März 2377

@ JW.ZG Nicht "alle" Leute! Diejenigen, die das tun, ziehen es entweder einfach vor oder wissen nicht, was structin C ++ bedeutet. ;) Aber es gibt keinen Grund, warum Sie das classSchlüsselwort nicht stattdessen verwenden können.
Leichtigkeitsrennen im Orbit

Antworten:


465

Sie vergessen den kniffligen zweiten Unterschied zwischen Klassen und Strukturen.

Quoth der Standard (§11.2.2 in C ++ 98 bis C ++ 11):

In Abwesenheit eines zugriffs Spezifizierer für eine Basisklasse, öffentlich angenommen wird , wenn die abgeleitete Klasse deklariert wird struct und private wird angenommen , wenn die Klasse deklariert ist Klasse .

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

Mitglieder einer mit der Schlüsselwortklasse definierten Klasse sind standardmäßig privat . Mitglieder einer Klasse, die mit den Schlüsselwörtern struct oder union definiert ist, sind standardmäßig öffentlich .

Zusätzlicher Unterschied: Mit dem Schlüsselwort classkönnen Vorlagenparameter deklariert werden, während das structSchlüsselwort nicht verwendet werden kann.


22
Das ist nicht wirklich ein zweiter Unterschied, es ist nur so, dass die Frage den Unterschied unvollständig ausdrückt. Alle Unterobjekte sind standardmäßig privat, wenn Sie " classpublic" verwenden struct, und beide definieren einen Klassentyp.
Ben Voigt

10
Ich denke, du hast den Punkt verpasst, Ben. Es ist die Vererbung, die für Strukturen öffentlich und für Klassen privat ist. Dies ist eine sehr wichtige Unterscheidung, die in keinerlei Zusammenhang mit dem tatsächlichen Mitgliederzugriff steht. Zum Beispiel 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 Auswirkungen haben.
Assaf Lavie

104
Tatsächlich besteht der wirklich schwierige Unterschied zwischen structund classdarin, dass Letzteres anstelle von a verwendet werden kann typename, um einen Vorlagenparameter zu deklarieren, während Ersteres dies nicht kann. :)
sbi

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

3
@sbi "der wirklich knifflige Unterschied zwischen Struktur und Klasse" - Süß, aber die Frage betrifft den Unterschied zwischen einer Struktur und einer Klasse, nicht die Unterschiede, wo die Schlüsselwörter verwendet werden können.
Jim Balter

161

Zitieren der 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 Standardeinstellungen zu verlassen.

Struktur und Klasse sind ansonsten funktional gleichwertig.

OK, genug von diesem blitzsauberen Techno-Gerede. Emotional unterscheiden die meisten Entwickler stark zwischen einer Klasse und einer Struktur. Eine Struktur fühlt sich einfach wie ein offener Stapel von Bits an, der nur sehr wenig Kapselung oder Funktionalität bietet. Eine Klasse fühlt sich wie ein lebendiges und verantwortungsbewusstes Mitglied der Gesellschaft mit intelligenten Diensten, einer starken Verkapselungsbarriere 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 existieren in gut gestalteten Systemen!), Aber ansonsten sollten Sie wahrscheinlich die Klasse verwenden Stichwort.


123

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 Sie einen objektorientierten Ansatz verfolgen. Wenn Sie also eine Form von C erstellen, die OOP nativ förderlich ist (Sie können OO in C ausführen, aber es hilft Ihnen nicht), war dies die richtige In C ++ (ursprünglich "C With Classes") ist es sinnvoll, Mitglieder standardmäßig privat zu machen.

Wenn Stroustrup andererseits die Semantik von geändert hätte, structsodass seine Mitglieder standardmäßig privat waren, hätte dies die Kompatibilität beeinträchtigt (dies ist nicht mehr so ​​oft der Fall, wie die Standards auseinander gingen, aber alle gültigen C-Programme waren auch gültige C ++ - Programme. was einen großen Einfluss darauf hatte, C ++ Fuß zu fassen).

Daher wurde ein neues Schlüsselwort classeingeführt, das genau wie eine Struktur ist, aber standardmäßig privat.

Wenn C ++ ohne Verlauf von Grund auf neu erstellt worden wäre, hätte es wahrscheinlich nur ein solches Schlüsselwort. Es hätte wahrscheinlich auch nicht die Wirkung erzielt, die es machte.

Im Allgemeinen neigen Menschen dazu, struct zu verwenden, wenn sie etwas tun, wie structs in C verwendet werden. öffentliche Mitglieder, kein Konstruktor (solange es nicht in einer Gewerkschaft ist, Sie können Konstrukteure in structs haben, genau wie bei Klassen, aber die Menschen sind in der Regel nicht zu), keine virtuellen Methoden usw. Da Sprachen so viel zu kommunizieren Leute, die den Code lesen, um Maschinen anzuweisen (oder wir würden uns an Assembly- und rohe VM-Opcodes halten), ist eine gute Idee, sich daran zu halten.


Es ist wahrscheinlich auch erwähnenswert, dass es wahrscheinlich einfacher war, Klassen und Strukturen unter der Haube gleich arbeiten zu lassen, als dass sie sich grundlegend unterscheiden. Im Nachhinein mag es von Vorteil gewesen sein, z. B. anzugeben, dass alles, was als Struktur deklariert wurde, ein PODS sein muss (dh es muss Strukturen verboten werden, virtuelle Mitglieder, nicht triviale Standardkonstruktoren oder Destruktoren usw. zu haben), aber meines Wissens hat so etwas nicht jemals von einem C ++ - Standard oder einer Implementierung gefordert worden.
Supercat

1
@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, hat das Konzept in den Vordergrund gerückt, und es scheint dort mehr als in reineren OO-Sprachen aufzutreten (und ist natürlich tatsächlich im Standard definiert). Die Geschichte des frühen C ++ erklärt definitiv viel darüber. Stroustrups "Das Design und die Entwicklung von C ++" ist eine interessante Lektüre.
Jon Hanna

1
Ich sehe einen religiösen Krieg zwischen Menschen , die , dass alles fühlen , die nicht „oop-ish“ ist, sollte es sein, und diejenigen , die diese OOP denken sollte als betrachtet werden ein Werkzeug, aber nicht das Werkzeug. C ++ scheint sicherlich die letztere Philosophie zu akzeptieren, aber ich weiß vorher wirklich nicht viel über Sprachen. Meine eigene Philosophie ist, wenn man ein Objekt will, sollte man ein Objekt verwenden, und wenn man eine Aggregation verwandter, aber unabhängiger Variablen will, sollte man das verwenden. C ++ macht keine syntaktische Unterscheidung zwischen solchen Dingen, und .NET versucht, diese Unterscheidung zu verwischen, aber das Wenige, das ich über D ...
Supercat

1
... schlägt vor, dass es es mehr als C ++ oder .NET erkennt. Aggregationen von Variablen sind nicht gerade OOPish, aber das bedeutet nicht, dass sie nicht verwendet werden sollten, wenn sie nützlich sind .
Supercat

3
Ich bin nicht einverstanden mit "C hat Strukturen, es hat kein Konzept der Kapselung, also ist alles öffentlich.". Sie können eine Definition structeiner *.cDatei in einer Datei ausblenden und andere Übersetzungseinheiten nur mit einem Zeiger verwenden lassen. Sie haben also eine noch stärkere Kapselung, da andere Übersetzungseinheiten nicht einmal wissen, was sich in der befindet struct.
12431234123412341234123

32

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 .


15
Nicht nur Mitglieder, sondern alle Zugriffe, einschließlich Vererbung.
Nemanja Trifunovic

4
Nun, ich würde sagen, der andere Unterschied ist die Semantik. Struktur für viele Menschen lässt sie "Datenstruktur" als Überbleibsel von C.
Kris Kumler

3
@KrisKumler: Das sind keine "Semantik"; Sie sind persönliche Gefühle. Beide structund classdeklarieren eine Klasse mit identischer Semantik (ungeachtet der parsenweisen Interpretation des Definitionskörpers).
Leichtigkeitsrennen im Orbit

28

Laut Stroustrup in der Programmiersprache C ++ :

Welchen Stil Sie verwenden, hängt von den Umständen und dem Geschmack ab. Normalerweise bevorzuge ich die Verwendung structfür Klassen, in denen alle Daten öffentlich sind. Ich stelle mir solche Klassen als "nicht ganz richtige Typen, nur Datenstrukturen" vor.

Funktionell gibt es keinen anderen Unterschied als öffentlich / privat


32
Welcher Unterschied? Bitte erkläre.
Crashmstr

10

STRUCT ist eine Art abstrakter Datentyp, der einen bestimmten Speicherbereich 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. (dh Erhalten Sie einen Zeiger auf die Struktur, berechnen Sie mit dem SIZE-Makro die Anzahl der zu kopierenden Bytes und verschieben Sie die Daten in die Struktur hinein oder aus der Struktur heraus.)

Klassen sind ein anderer Typ eines abstrakten Datentyps, der versucht, das Ausblenden von Informationen sicherzustellen. Intern kann es eine Vielzahl von Machenschaften, Methoden, Temperaturvariablen und Zustandsvariablen geben. usw., die alle verwendet werden, um jedem Code, der die Klasse verwenden möchte, eine konsistente API zu präsentieren.

In der Tat geht es 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 Pre-Compiler, 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 selbst.

Abgesehen von der Tatsache, dass jede 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 Entwickler einem Muster von _ (). zB 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. Dadurch kann der Programmierer seinen Code besser organisieren und die Wiederverwendung von Code erhöhen. Zumindest theoretisch.


1
Dies ist das nicht offensichtlichste an Strukturen und Klassen. "Bei Strukturen geht es um Daten, bei Klassen geht es um Code" kann umformuliert werden als "Bei Strukturen geht es um Daten, bei Klassen geht es um Daten, Sicherheit und Operationen, die mit diesen Daten ausgeführt werden"
Arun Aravind

3
Es ist nicht möglich, eine Struktur in C ++ zu erstellen. Es ist nur möglich, eine Klasse mit dem geerbten structSchlüsselwort zu erstellen .
Leichtigkeitsrennen im Orbit

1
Diese Antwort scheint nicht C ++ zu betreffen. Deklariert in C ++ structKlassen (einschließlich public/ private/ protected, Vererbung usw.).
Melpomene

Wie sind Strukturen abstrakt? Das Schreiben von Rohstrukturen in eine Datei ist selbst in C mit Problemen behaftet (die üblichen Probleme sind Auffüllen, Endianness, unterschiedliche Wortgröße usw.). Was ist das für ein SIZEMakro, von dem du sprichst?
Melpomene

10

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

Zum Beispiel schlägt Programm 1 beim Kompilieren 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. Beim Ableiten einer Klasse ist der Standardzugriffsspezifizierer privat.

Zum Beispiel schlägt Programm 3 beim Kompilieren 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;
}

Ich habe Codebeispiele 3-7 entfernt, wie von Experten erwähnt
Suraj K Thomas

8

Der einzige andere Unterschied ist die Standardvererbung von Klassen und Strukturen, die nicht überraschend privat bzw. öffentlich ist.


5
  1. Die Mitglieder einer Struktur sind standardmäßig öffentlich, die Mitglieder der Klasse sind standardmäßig privat.
  2. Die Standardvererbung für Struktur von einer anderen Struktur oder Klasse ist öffentlich. Die Standardvererbung für Klasse von einer anderen Struktur oder Klasse ist privat.
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.


_tmainist nicht Standard C ++.
Melpomene

4

Nicht in der Spezifikation, nein. Der Hauptunterschied besteht in den Erwartungen der Programmierer, wenn sie Ihren Code in 2 Jahren lesen. Strukturen werden oft als POD angenommen. Strukturen werden auch bei der Metaprogrammierung von Vorlagen verwendet, wenn Sie einen Typ für andere Zwecke als das Definieren von Objekten definieren.


4

Wenn Sie eine Legacy-App mit Strukturen zur Verwendung von Klassen aktualisiert haben, tritt möglicherweise Folgendes auf:

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

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

Dies würde alten Legacy-Code beschädigen, wenn im alten Code irgendwo die Struktur mit memfill gelöscht würde, um alles auf Null zu löschen, würde dies auch die zusätzlichen Zeigerdaten stampfen.


1
Code, der memfill zum Löschen einer Struktur verwendet, hat wahrscheinlich andere anstößige Gewohnheiten. Gehen Sie mit Vorsicht.
David Thornley

@DavidThornley: Die Verwendung einer Nullfüllung zum Löschen oder Initialisieren einer Datenstruktur ist in C Standard. In einem Projekt mit gemischten Sprachen kann man nicht erwarten, dass der Code im C-Teil calloczugunsten von vermieden wird new. Alles, was man tun kann, ist sicherzustellen, dass alle vom C-Teil des Codes verwendeten Strukturen tatsächlich PODS sind.
Supercat

4
  1. Mitglieder einer mit dem Schlüsselwort definierten Klasse classsind privatestandardmäßig. Mitglieder einer Klasse, die mit den Schlüsselwörtern struct(oder union) definiert ist, sind publicstandardmäßig.

  2. In Abwesenheit eines Zugriffsspezifizierers für eine Basisklasse publicwird angenommen, wenn die abgeleitete Klasse deklariert wird, structund privatewird angenommen, wenn die Klasse deklariert wird class.

  3. Sie können ein enum classaber kein deklarieren enum struct.

  4. Sie können template<class T>aber nicht verwenden template<struct T>.

Beachten Sie auch, dass Sie mit dem C ++ - Standard einen Typ als de vorwärts deklarieren structund dann classbeim Deklarieren des Typs verwenden können und umgekehrt. Auch std::is_class<Y>::valueist truefür Y ein structund ein class, aber ist falsefür ein enum class.


nette Antwort, obwohl mir eine eindeutige 0 fehlt.) Der Unterschied zwischen structund classin c ++ ist ein Unterschied zwischen Schlüsselwörtern, nicht zwischen Datentypen (oder einer besseren Alternative;)
idclev 463035818

@ ehemalsknownas_463035818: Aber denkst du nicht, dass das std::is_class<Y>::valueabdeckt?
Bathseba

Ja, ich dachte nur, es könnte prominenter sein, denn das ist das übliche Missverständnis, und wenn das einmal aus dem Weg ist, ist der Rest nur eine Folge.
idclev 463035818

Vergiss nicht, deine Antwort ist perfekt wie sie ist, ich habe eine andere geschrieben, es tut nicht weh, noch eine zu haben
idclev 463035818

4

Der Unterschied zwischen classund structist 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 Kontext ist der unterschiedliche Standardzugriff:

  • foo::x ist öffentlich und foo_base wird öffentlich vererbt
  • bar::xist privat und bar_basewird privat vererbt

2

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, außer dass die Mitglieder einer Struktur standardmäßig öffentlich sichtbar sind, die Mitglieder einer Klasse jedoch standardmäßig privat sichtbar sind.


2

Es ist nur eine Konvention. Strukturen können erstellt werden, um einfache Daten zu speichern, aber später durch Hinzufügen von Elementfunktionen und Konstruktoren die Zeit weiterentwickeln. Andererseits ist es ungewöhnlich, etwas anderes als öffentlich zu sehen: Zugriff in einer Struktur.


2

ISO IEC 14882-2003

9 Klassen

§3

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


2

Ein weiterer Hauptunterschied besteht in Bezug auf 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

1
Wenn Sie betonen möchten, dass Strukturen nicht als verallgemeinerte Typen verwendet werden können, dann liegen Sie falsch. Und structist dort nicht nur durch Konvention erlaubt (besser gesagt, es ist ein classSchlüsselwort, das hier in einem anderen Sinne verwendet wird, siehe Verwenden von 'Klasse' oder 'Typname' für Vorlagenparameter ).
dma_k

Das Schlüsselwort ist dort nicht erlaubt, aber Sie können eine Klasse übergeben, die Sie mit structfein definiert haben . Probieren Sie es einfach aus. struct T{}; template <typename T> void foo() {} foo<T>();
Leichtigkeitsrennen im Orbit

1

In den anderen Antworten wurden 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 Arten, dasselbe Element zu definieren).

Was interessant sein könnte (insbesondere da der Fragesteller wahrscheinlich MSVC ++ verwendet, da er "nicht verwaltetes" C ++ erwähnt), ist, dass sich Visual C ++ unter bestimmten Umständen beschwert, wenn eine Klasse mit deklariert classund dann mit struct(oder möglicherweise umgekehrt) definiert wird ), obwohl der Standard besagt, dass dies vollkommen legal ist.


Ich weiß, dass es sich um einen sehr späten Kommentar handelt, aber beachten Sie, dass die oben genannte Warnung nicht unbegründet ist, da Windows ABI Strukturen und Klassen unterschiedlich zerlegt und daher das Mischen von (Vorwärts-) Deklarationen von Klasse und Struktur tatsächlich zu schwer nachvollziehbaren Verknüpfungsproblemen führen kann!
MFH

1
  • . In Klassen sind standardmäßig alle Mitglieder privat, in der Struktur sind Mitglieder standardmäßig öffentlich.

    1. Es gibt keinen Begriff wie Konstruktor und Destruktor für Strukturen, aber für Klassen-Compiler wird Standard erstellt, wenn Sie dies nicht angeben.

    2. Größe der leeren Struktur ist 0 Bytes wer als Größe der leeren Klasse ist 1 Byte Der Standardzugriffstyp der Struktur ist öffentlich. 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, die Konvention besteht 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 darauf verwiesen wird. In anderen Sprachen können Klassen und Strukturen unterschiedliche Semantiken haben - dh. Objekte (Instanzen von Klassen) können als Referenz übergeben werden und Strukturen können als Wert übergeben werden. Hinweis: Mit dieser Frage sind Kommentare verknüpft. Weitere Informationen zur Konversation finden Sie auf der Diskussionsseite.


3
"2. Größe der leeren Struktur ist 0 Bytes wer als Größe der leeren Klasse ist 1 Byte". Falsch. Ich habe gerade mit getestet g++. Sie denken vielleicht an die Optimierung der leeren Basis, aber das gilt auch für beide.
cdunn2001

1
Nicht wahr. In C ++ ist die Größe einer leeren Struktur 1. In C ist eine leere Struktur nicht zulässig. GCC erlaubt leere Strukturen in C als Compiler-Erweiterung und eine solche Struktur hat die Größe 0.
Johan Råde

Diese Antwort ist falsch. Zusätzlich zur Größe ist der Konstruktor / Destruktor-Teil auch ungenau: Strukturen können Konstruktoren und Destruktoren in Ordnung haben. Erstellt in der Tat structvollwertige Klassen in C ++.
Melpomene

1

Obwohl dies durch andere Antworten impliziert wird, wird nicht explizit erwähnt, dass Strukturen je nach Verwendung C-kompatibel sind. Klassen sind nicht.

Dies bedeutet, wenn Sie 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 haben kann).


-1

Sie können dies als Richtlinie für die Entscheidung für Struktur oder Klasse unter https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx betrachten .

√ BEACHTEN SIE, dass eine Struktur anstelle einer Klasse definiert wird, wenn Instanzen des Typs klein und häufig von kurzer Dauer sind oder häufig in andere Objekte eingebettet sind.

X Vermeiden Sie das Definieren einer Struktur, es sei denn, der Typ weist alle folgenden Merkmale auf:

Es stellt logischerweise einen einzelnen Wert dar, ähnlich wie primitive Typen (int, double usw.).

Es hat eine Instanzgröße unter 16 Bytes.

Es ist unveränderlich.

Es muss nicht häufig verpackt werden.


Hier geht es um .NET / C #, nicht um C ++.
Melpomene

-2

Klasse ist nur im Kontext der Softwareentwicklung sinnvoll. Im Kontext von Datenstrukturen und Algorithmen unterscheiden sich Klasse und Struktur nicht so stark. Es gibt keine eingeschränkte Regel, dass auf das Mitglied der Klasse verwiesen werden muss.

Wenn Sie ein großes Projekt mit Tonnen von Menschen ohne Klasse entwickeln, erhalten Sie möglicherweise endlich komplizierten gekoppelten Code, da jeder die gewünschten Funktionen und Daten verwendet. Klasse bietet Berechtigungssteuerelemente und Inhärenten, um die Entkopplung und Wiederverwendung von Codes zu verbessern.

Wenn Sie einige Prinzipien der Softwareentwicklung lesen, werden Sie feststellen, dass die meisten Standards ohne Unterricht nicht einfach implementiert werden können. Zum Beispiel: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

Übrigens: Wenn eine Struktur eine Speicherknappheit zuweist und mehrere Variablen enthält, geben Werttypvariablen an, dass Werte dort eingebettet sind, wo die Struktur zugewiesen ist. Im Gegensatz dazu sind die Werte der Referenztypvariablen extern und werden durch einen Zeiger referenziert, der auch in die Zuordnung von struct eingebettet ist.


Diese Antwort scheint nicht C ++ zu betreffen. Deklariert in C ++ structKlassen (einschließlich Berechtigungssteuerelemente, Vererbung usw.).
Melpomene

-3

Der Unterschied zwischen Struktur- und Klassenschlüsselwörtern in C ++ besteht darin, dass, wenn es keinen bestimmten Bezeichner für einen bestimmten zusammengesetzten Datentyp gibt, standardmäßig struct oder union die öffentlichen Schlüsselwörter sind, die lediglich das Ausblenden von Daten berücksichtigen, class jedoch das private Schlüsselwort ist, das das Ausblenden von Programmen berücksichtigt Codes oder Daten. Einige Programmierer verwenden immer struct für Daten und class für Code. Weitere Informationen erhalten Sie bei anderen Quellen.


OP erwähnte bereits, dass structMitglieder standardmäßig öffentlich sind, und die akzeptierte Antwort aus dem Jahr 2009 erwähnt die Vererbung. Warum eine weitere Antwort schreiben, die 4 Jahre später keine neuen Informationen hinzufügt?
Melpomene

-3

Aus all diesen Faktoren kann geschlossen werden, dass die Konzeptklasse sehr gut geeignet ist, Objekte der realen Welt und nicht "Strukturen" darzustellen. Hauptsächlich, weil OOP-Konzepte, die im Unterricht verwendet werden, sehr praktisch sind, um Szenarien der realen Welt zu erklären, daher einfacher, sie mit der Realität zusammenzuführen. Zum Beispiel ist die Standardvererbung für Strukturen öffentlich, aber wenn wir diese Regel für die reale Welt anwenden, ist sie lächerlich. Aber in einer Klasse ist die Standardvererbung privat, was realistischer ist.

Was ich jedoch rechtfertigen muss, ist, dass Klasse ein viel breiteres, in der realen Welt anwendbares Konzept ist, während Struktur ein primitives Konzept mit schlechter interner Organisation ist (obwohl Struktur OOP-Konzepten folgt, haben sie eine schlechte Bedeutung).


1
Wie ist private Vererbung "realistischer"? Die meisten Programmiersprachen haben nicht einmal das Konzept der privaten Vererbung.
Melpomene

-3

Der Hauptunterschied zwischen Struktur- und Klassenschlüsselwort in oops besteht darin, dass in der Struktur keine öffentliche und private Mitgliedsdeklaration vorhanden ist und die Datenelement- und Mitgliedsfunktion als öffentlich, privat sowie geschützt definiert werden kann.


Diese Antwort scheint nicht C ++ zu betreffen. Deklariert in C ++ structKlassen (einschließlich public/ private/ protected, Vererbung usw.).
Melpomene

-3

** UPDATE: ** Bitte ignorieren Sie diese Antwort. Ich habe die Möglichkeit nicht in Betracht gezogen, dass der Wert für die Struktur nicht initialisiert wurde, sondern zufällig 0 war. Es gibt keinen Initialisierungsunterschied zwischen Struktur und Klasse.


Ich sehe einen anderen Unterschied zwischen Strukturen und Klassen, der mit der Standardinitialisierung zu tun hat.

struct Foo {
    int a;
};

class Bar {
    int a;
};

class Tester {
    Foo m_Foo = Foo();
    Bar m_Bar = Bar();

public:
    Tester() {}
};

int main() {
    auto myTester = Tester();
}

Führen Sie diesen Code aus und untersuchen Sie myTester. Sie werden feststellen, dass für m_Foo die Struktur m_Foo.a auf 0 initialisiert wurde, für m_Bar die Klasse m_Bar.a jedoch nicht initialisiert ist. Es scheint also einen Unterschied zu geben, was der Standardkonstruktor für struct vs. class tut. Ich sehe das mit Visual Studio.


1
Wie haben Sie festgestellt, dass dies m_Foo.ainitialisiert wurde? Was wäre, wenn es nicht initialisiert wäre und zufällig wäre 0?
Melpomene

Uhhh, ich habe es nicht getan. Mein Fehler. Dies ist kein Unterschied zwischen Struktur und Klasse. Die Initialisierungseigenschaften sind gleich.
Eric Hill

-4

Der Hauptunterschied zwischen struct und class besteht darin, dass Sie in struct nur Datenvariablen verschiedener Datentypen deklarieren können, während Sie in class Datenvariablen und Elementfunktionen deklarieren und somit Datenvariablen über Funktionen bearbeiten können.

-> Eine weitere nützliche Sache, die ich in class vs struct finde, ist, dass Sie beim Implementieren von Dateien in einem Programm, wenn Sie bei jeder neuen Gruppe von Operationen immer wieder Operationen an einer Struktur ausführen möchten, eine separate Funktion erstellen müssen und müssen Übergeben Sie das Objekt struct nach dem Lesen aus der Datei, um einige Operationen daran durchzuführen. Wenn Sie im Unterricht eine Funktion erstellen, die jedes Mal einige Operationen an den benötigten Daten ausführt, müssen Sie nur das Objekt aus der Datei lesen und die Funktion aufrufen.

Aber es hängt vom Programmierer ab, auf welche Weise er / sie es für geeignet hält ... meiner Meinung nach bevorzuge ich jedes Mal Unterricht, nur weil es OOPs unterstützt, und das ist der Grund, warum es in fast allen Sprachen implementiert ist und das wunderbare Merkmal aller Zeitprogrammierung ist; - )

Und ja, der unvergessenste Unterschied, den ich vergessen habe zu erwähnen, ist, dass die Klasse das Ausblenden von Daten unterstützt und auch Operationen unterstützt, die für eingebaute Datentypen ausgeführt werden, während struct dies nicht tut!


1
In C ++ structkönnen Mitgliedsfunktionen haben
chtz

@chtz Danke ... ich habe gerade von dieser Funktion erfahren ... vielen Dank ... ich bin nur ein Anfänger, nicht so erfahren wie du, also brauche ich in Zukunft auch Ratschläge von euch :-)
Yug Rawal

und tatsächlich ist die Mitgliedsfunktion in ihrer weiteren Bedeutung zu verstehen. structkann Konstruktoren, Mitgliedsfunktionen und Distruktoren haben (möglicherweise virtuell, möglicherweise privat, geschützt oder öffentlich). Sie können erben und vererbt werden. Also eigentlich ... alles, was eine Klasse haben kann. Eine typische Konvention besteht darin, mit struct zu deklarieren, was Sie in C als struct deklariert hätten, und als Klasse, wenn wir private und geschützte Variablen, virtuelle Funktionen, ctor und dtor usw. deklarieren. Aber es ist nur eine Konvention, die nicht von der Sprache durchgesetzt wird
Gian Paolo

-5

Ich habe einen anderen Unterschied gefunden. Wenn Sie keinen Konstruktor in einer Klasse definieren, definiert der Compiler einen. Wenn Sie jedoch in einer Struktur keinen Konstruktor definieren, definiert der Compiler auch keinen Konstruktor. In einigen Fällen, in denen wir wirklich keinen Konstruktor benötigen, ist struct die bessere Wahl (Leistungstipp). und Entschuldigung für mein schlechtes Englisch.


4
Das ist nicht wahr. In dieser Hinsicht gibt es keinen Unterschied zwischen einer mit dem structSchlüsselwort definierten Klasse und einer mit dem classSchlüsselwort definierten Klasse .
Ymett

Wenn ich eine Struktur ohne Konstruktor verwende, erhalte ich eine bessere Geschwindigkeit als eine Klasse ohne Konstruktor.
Ali

@Ali Nein, tust du nicht.
Leichtigkeitsrennen im Orbit

-5

Klassen sind Referenztypen und Strukturen sind Wertetypen.
Wenn ich sage, dass Klassen Referenztypen sind,
enthalten sie im Grunde die Adresse einer Instanzvariablen.

Zum Beispiel:

Class MyClass
{
    Public Int DataMember;  //By default, accessibility of class data members 
                            //will be private. So I am making it as Public which 
                            //can be accessed outside of the class.
}

In der Hauptmethode kann
ich eine Instanz dieser Klasse mit einem neuen Operator erstellen, der Speicher für diese Klasse
zuweist und deren Basisadresse in der Variablen vom Typ MyClass (_myClassObject2) speichert.

Static Public void Main (string[] arg)
{
    MyClass _myClassObject1 = new MyClass();
    _myClassObject1.DataMember = 10;

    MyClass _myClassObject2 = _myClassObject1;
    _myClassObject2.DataMember=20;
}

Im obigen Programm ist MyClass _myClassObject2 = _myClassObject1; Anweisung gibt an, dass beide Variablen vom Typ MyClass sind

  1. myClassObject1
  2. myClassObject2

und zeigt auf denselben Speicherort.
Grundsätzlich wird derselbe Speicherort einer anderen Variablen des gleichen Typs zugewiesen.

Wenn also Änderungen, die wir an einem der Objekttypen MyClass vornehmen, Auswirkungen auf einen anderen haben, zeigen
beide auf denselben Speicherort.

"_myClassObject1.DataMember = 10;" In dieser Zeile enthalten beide Datenelemente des Objekts den Wert 10.
"_myClassObject2.DataMember = 20;" In dieser Zeile enthält das Datenelement des Objekts den Wert 20.
Schließlich greifen wir über Zeiger auf Datenelemente eines Objekts zu.

Im Gegensatz zu Klassen sind Strukturen Werttypen. Zum Beispiel:

Structure MyStructure
{
    Public Int DataMember;  //By default, accessibility of Structure data 
                            //members will be private. So I am making it as 
                            //Public which can be accessed out side of the structure.
}

Static Public void Main (string[] arg)
{
    MyStructure _myStructObject1 = new MyStructure();
    _myStructObject1.DataMember = 10;

    MyStructure _myStructObject2 = _myStructObject1;
    _myStructObject2.DataMember = 20;
}

Im obigen Programm wird
das Objekt vom Typ MyStructure mithilfe eines neuen Operators instanziiert und die
Adresse in der Variablen _myStructObject vom Typ MyStructure und gespeichert
dem Datenelement der Struktur mit "_myStructObject1.DataMember = 10" der Wert 10 zugewiesen.

In der nächsten Zeile
deklariere ich eine andere Variable _myStructObject2 vom Typ MyStructure und weise ihr _myStructObject1 zu.
Hier erstellt der .NET C # -Compiler eine weitere Kopie des Objekts _myStructureObject1 und
weist diesen Speicherort der MyStructure-Variablen _myStructObject2 zu.

Was auch immer wir an _myStructObject1 ändern, wird sich niemals auf eine andere Variable _myStructObject2 vom Typ MyStructrue auswirken.
Deshalb sagen wir, dass Strukturen Werttypen sind.

Die unmittelbare Basisklasse für die Klasse ist also Object und die unmittelbare Basisklasse für Structure ist ValueType, das von Object erbt.
Klassen unterstützen eine Vererbung, Strukturen dagegen nicht.

Wie sagen wir das?
Und was ist der Grund dafür?
Die Antwort lautet Klassen.

Es kann abstrakt, versiegelt, statisch und teilweise sein und kann nicht privat, geschützt und intern geschützt sein.


4
Ich denke, dies versucht, die Frage für c # zu beantworten? Die Frage bezieht sich auf c ++, und das macht diese Antwort ungenau, oder?
smw

@smw absolut, er hat seinen Beispielcode in C # geschrieben und ich bin hierher gekommen, um zu überprüfen, ob es keinen Unterschied bei der Parameterübergabe zwischen C ++ structund gibt class. Niemand hier hat es erwähnt, noch das gesamte Web. Ich denke also, dass dies auch nicht für C ++ gilt.
John

Dies ist nicht einmal ein gültiger C # -Code - die Schlüsselwörter sind alle falsch. "Public", "Static", "Int" und "Class" sollten nicht großgeschrieben werden und "struct" und nicht "Structure" sein. Die Beschreibung ist für C # meistens korrekt (obwohl Strukturen immer noch Schnittstellen erben können, nur keine anderen Strukturen), beantwortet aber die Frage nicht, da es sich um C ++ handelte ...
Darrel Hoffman

2
Diese Antwort ist völliger Unsinn. Es verwendet eine seltsame Mischung aus Visual Basic und C # für seine Codebeispiele, und die ganze Sache "Klassen sind Referenztypen und Strukturen sind Wertetypen" ... gilt nur für .NET (dh C #), nicht für C ++. Du bist im falschen Raum, Alter. Hier gehören Sie hin: stackoverflow.com/questions/13049
TheFlash

Aber diese Antwort zeigt das gleiche für C gültig ist (++), dass structs wie Werttypen verwendet werden. int a = 3; int b = a;und ähnlichMyStruct a=MyStruct("data"); MyStruct b = a;
Glückydonald

-8

Es gibt 3 grundlegende Unterschiede zwischen Struktur und Klasse

1St-Speicher sind für die Struktur im Stapelspeicher (der der Programmiersprache nahe kommt) reserviert, unabhängig davon, ob für Klassen im Stapelspeicher nur Verweise reserviert sind und der tatsächliche Speicher im Heapspeicher reserviert ist.

2Nd - Standardmäßig wird die Struktur als öffentlich behandelt, unabhängig davon, ob die Klasse als privat behandelt wird.

3Rd- kann Code in der Struktur nicht wiederverwenden, aber in der Klasse können wir denselben Code in vielen Zeiten, die als Vererbung bezeichnet werden, wiederverwenden


2
C ++ - Strukturen unterstützen Vererbung und abstrakte Methoden. Struktur und Klasse werden auf die gleiche Weise zugeordnet. Das Zuweisen von Klassen auf dem Heap, auch wenn sie nicht mit einem "neuen" instanziiert sind, ist für eingebettete Systeme nicht sinnvoll.
JCMS

2
# 1 ist auch falsch. Der Stapel wird verwendet, wenn Sie etwas dieses Typs als lokale Variable deklarieren, und der Heap wird verwendet, wenn Sie den Operator "new" verwenden.
Score_Under
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.