Class vs. Struct

  • C++

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von KidRick.

    Class vs. Struct

    Moin,
    ich weiß das das Thema wahrscheinlich schon hundertemale besprochen wurde und das es einige Diskussionen und verschiedene Meinungen dazu gibt. Aber, wann sollte ich was benutzen? Viele C++ Programmierer benutzen nur struct's andere nur classes. Was ist effizienter? Wann sollte ich was benutzen? Wäre ganz cool wenn mich jemand darüber aufklärt :)

    Grüße,
    Jan
    Software being "Done" is like lawn being "Mowed". (Jim Benson)
    Es ist im Endeffekt dasselbe. Der Unterschied besteht darin, dass die Access Modifier für die Member in einer Struktur standardmäßig public und in einer Klasse private sind. Ansonsten ist da kaum ein Unterschied.

    Im Vergleich zu C, wo Strukturen reine Datenrepräsentanten sind/waren (keine Methoden, kein Konstruktor, ...), hat C++ die Semantics eben stark erweitert. Du kannst auch Strukturen vererben, was z. B. in C# nicht geht. Gut, man könnte in C dann entsprechend delegieren und Pointer zu den Methoden als Member speichern, aber das ist eben alles nicht so schön, wie man das normal gewohnt ist und daher kann man schon sagen, dass die POD-Structs sind. Viele verwenden das auch ausschließlich so und nehmen für alles andere Klassen, aber das ist mehr oder weniger wohl Ansichtssache.

    Ich würde das je nach Nutzungszweck unterschieden. Wenn ich jetzt bspw. einen Vektor repräsentieren will, dann nehme ich eine Struktur. Für das Verrichten von Aufgaben und funktionelles eher Klassen..

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Edit: Bitte ignorieren, hatte den Tag [C++] nicht gesehen, da ich auf den Link unter "Letzte Beiträge" geklickt habe. Diese Antwort ist somit ausschließlich für .NET (C#/VB.NET) relevant!

    Irrelevant

    Trade schrieb:

    Ansonsten ist da kaum ein Unterschied.

    Hier muss ich vehement widersprechen!
    Der größte Unterschied zwischen einer Klasse und einer Struktur besteht in der Unterscheidung zwischen Referenztyp und Werttyp. Und dieser Unterschied ist ausgesprochen relevant. Wenn du ein Klassenobjekt als Parameter übergibst und in der entsprechenden Methode veränderst, wird auch das ursprüngliche Objekt verändert. Bei einem Strukturobjekt als Parameter, wird dieses kopiert und dann entsprechend auf dieser Kopie weitergearbeitet, Änderungen betreffen somit nicht das ursprüngliche Objekt (Quelle).

    Was den Einsatz betrifft, so gibt es auch gleich eine Empfehlung von MSDN: "Structs are best suited for small data structures that contain primarily data that is not intended to be modified after the struct is created."

    Wenn du Objekte einer Klasse nur erschaffst und die Eigenschaften nur einmal setzt (in erster Linie im Konstruktor), dann könntest / solltest du höchstwahrscheinlich eine Struktur verwenden.


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „lukekogv“ ()

    @lukekogv Da erzählst Du mir nichts neues und ich weiß auch durchaus, wann man in .NET Wertetypen verwenden sollte. Das trifft allerdings nicht auf C++ zu, wie Niko schon richtig angemerkt hat. C++ ist eine Sprache, die auf Wertetypen basiert. Referenzen haste dort nur explizit mit dem &-Operator. Ansonsten ist alles ein Wertetyp bzw. wird "by value" behandelt.

    C-Quellcode

    1. MyClass a; // Instanzen auf dem Stack erzeugen
    2. MyClass b;
    3. a = b; // Setzt keine Referenz, wie in C# bspw., sondern kopiert die einzelnen Member


    Für eine Referenz müsstest Du explizit & hinter die Deklaration setzen. Das ist bei Strukturen nicht anders wie bei Klassen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ist dasselbe, bis auf die Defaultzugruffsstufe. Eine Struct hat genauso wie eine Class Defaultkonstruktor, Movekonstruktir, Kopierkonstruktor (s. Trade oben) und n Destruktor. Beide landen aufm Stack. Das was einer .Net Struct eher gleich kommt ist eine union, mit dem Unterschied, dass alle Daten auf der selben Adresse liegen.
    Danke für die Erklärungen, der LLVM Code Styleguide hat dazu auch was schönes gepostet was ich so benutzen werde :)

    Quellcode

    1. / Foo feels like a class... this is strange.
    2. struct Foo {
    3. private:
    4. int Data;
    5. public:
    6. Foo() : Data(0) { }
    7. int getData() const { return Data; }
    8. void setData(int D) { Data = D; }
    9. };
    10. // Bar isn't POD, but it does look like a struct.
    11. struct Bar {
    12. int Data;
    13. Bar() : Data(0) { }
    14. };
    Software being "Done" is like lawn being "Mowed". (Jim Benson)