Klasse versus Struktur


12

In C ++ und anderen beeinflussten Sprachen gibt es ein Konstrukt mit dem Namen Structure ( struct) und ein anderes mit dem Namen the class. Beide können Funktionen und Variablen aufnehmen. Einige Unterschiede sind:

  1. Klasse erhält Speicher im Heap und structSpeicher im Stack (Bemerkung: Dies ist falsch für C ++, aber möglicherweise korrekt in dem, was das OP "beeinflusste Sprachen" nennt)
  2. Klassenvariablen sind standardmäßig privat und in structöffentlich

Meine Frage ist: structWurde das irgendwie für den Unterricht aufgegeben? Wenn ja warum? Abgesehen von den oben genannten Unterschieden structkann a die gleichen Aktionen ausführen wie eine Klasse. Warum also aufgeben?


Mit Verlassenheit meine ich, warum eins über dem anderen verwendet wird.
Prometheuspk

Ihre Frage beantwortet dies selbst, denke ich.
Umair A.

3
Der Unterschied zwischen Klassen und Strukturen ist sprachabhängig. Einige Lektionen aus C ++ gelten nicht wirklich für C #.
Job

6
Uhhhh. In C ++ können Sie Objekte auf dem Stack oder Heap zuordnen. Wo immer Sie wollen.
Jojo

8
Falsch, falsch, falsch. Stack vs. Heap hat nichts mit dem Unterschied zu tun.
Aaronaught

Antworten:


11

Es wird überhaupt nicht aufgegeben. Tatsächlich classbieten Ihnen auch moderne Sprachen wie C #, die stark genutzt werden, noch Unterstützung struct. Ich verweise auf diesen Artikel, wenn es nützlich ist, eine über die andere zu wählen:

Auswahl zwischen Klassen und Strukturen

Zitiert aus dem MSDN-Artikel:

Ziehen Sie die Definition einer Struktur anstelle einer Klasse in Betracht, wenn Instanzen des Typs klein und häufig kurzlebig sind oder häufig in andere Objekte eingebettet sind.

Definieren Sie keine Struktur, es sei denn, der Typ weist alle folgenden Merkmale auf:

  • Es stellt logischerweise einen einzelnen Wert dar, ähnlich wie bei primitiven Typen (Integer, Double usw.).
  • Die Instanzgröße ist kleiner als 16 Byte.
  • Es ist unveränderlich.
  • Es muss nicht häufig verpackt werden.

4
Diese Antwort ist wirklich falsch, da .Net / C # struct / class eine andere Bedeutung hat als C ++: Sie verwenden denselben Namen, haben aber je nach Sprache eine andere Semantik !!! In C ++ gibt es fast keinen Unterschied zwischen struct und class und die Frage ist im ersten Punkt völlig falsch, was in c # und D richtig ist, aber nicht in c ++. Der Link zu diesem Artikel, der sich mit .Net befasst, ist also wirklich wirklich falsch. Es ist nicht C ++!
Klaim

@Klaim ist technisch gesehen auch nicht für C # geeignet (Strukturen können sich auf dem Heap befinden) Der wichtige Unterschied in C # besteht in der Wert- und der Referenzsemantik, die C ++ nicht benötigt, da es Werte oder Referenzen für alles haben kann
jk.

17

Sie täuschen sich in C ++: Der einzige signifikante Unterschied zwischen Klasse und Struktur ist der Unterschied zwischen den Standardzugriffsspezifizierern. Struktur und Klasse sind in jeder Hinsicht Synonyme. Ich glaube, Struktur wird beibehalten, um die Abwärtskompatibilität mit C zu gewährleisten.


7
Nicht nur. Struct ist eine gute Wahl, wenn Sie nur eine Reihe von Daten in einem Objekt sichern und diesem kein Verhalten hinzufügen möchten.
quant_dev

2
@quant: Das ist ein schrecklicher Grund, eine Struktur zu verwenden. Ich hoffe wirklich, dass dieser Kommentar ein Augenzwinkern war.
Aaronaught

1
@Aaronaught Warum? Meiner Ansicht nach ist die Verwendung von struct ziemlich normal
quant_dev

1
@Aaronaught Wie geben Sie dann mehrere Werte zurück? Angenommen, ein Verarbeitungsmodell gibt den Clean Price, den Dirty Price und die Summe der aufgelaufenen Zahlungen zurück.
quant_dev

1
@quant_dev - Sie können entscheiden, einer Struktur eine Meta-Bedeutung für Ihre Zwecke zuzuweisen (und für frühere C-Programmierer eine, die tatsächlich sehr viel Sinn macht), aber das ändert nichts an der Tatsache, dass der einzige Unterschied zwischen der Struktur und Klassenschlüsselwörter in C ++ sind der Standardzugriff.
Joris Timmermans

2

Die Sprache D hat eine größere Unterscheidung zwischen Klasse und Struktur geschaffen

Eine Struktur in d ist nichts anderes als ein Stapel zugeordneter Datensatz mit einigen Funktionen, die Sie aufrufen können (es gibt keine Option) für die Vererbung, es sei denn, Sie verwenden ein enum + union-Setup, dh Sie implementieren den Polymorfismus selbst), der als Wert übergeben wird

Eine Klasse ist so, wie wir es gewohnt sind: virtuelle Funktionen, Heap-Zuweisung, (einfache) Vererbung, übergeben durch ref

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.