Frage

In welchen Szenarien ist es besser, a zu verwenden struct vs. a class in C++?

War es hilfreich?

Lösung

Die Unterschiede zwischen einem class und einem struct in C ++ sind, dass structs haben Standard public Mitglieder und Basen und Klassen haben Standard private Mitglieder und Basen. Beiden Klassen und Strukturen können eine Mischung aus public haben, protected und private Mitglieder, Vererbung verwenden können und Member-Funktionen haben.

Ich würde empfehlen, structs als plain-old-Datenstrukturen ohne Klasse-ähnliche Funktionen, und mithilfe von Klassen als zusammengesetzte Datenstrukturen mit private Daten und Elementfunktionen verwendet wird.

Andere Tipps

Wie alle anderen stellt fest, gibt es eigentlich nur zwei tatsächliche sprachliche Unterschiede:

  • struct standardmäßig auf den Zugang der Öffentlichkeit und class standardmäßig auf einen privaten Zugang.
  • Wenn vererben, struct defaults Vererbung und public standardmäßig class Erbe private. (Ironischerweise wie bei so vielen Dingen in C ++, ist die Standard rückwärts: public Vererbung bei weitem die gemeinsame Wahl ist, aber die Menschen nur selten erklären structs nur auf speichern Eingabe des „public“ keyword
  • .

Aber der wirkliche Unterschied in der Praxis zwischen einem class / struct, die einen Konstruktor / Destruktor und einen erklärt, das nicht. Es gibt bestimmte Garantien für einen „plain-old-Daten“ POD-Typen, dass nicht mehr gelten, wenn Sie die Bau der Klasse übernehmen. Damit diese Unterscheidung klar, nur viele Menschen bewusst structs für POD-Typen verwenden, und, wenn sie irgendwelche Methoden überhaupt hinzufügen wollen, verwenden Sie classes. Der Unterschied zwischen den beiden Fragmenten unter ansonsten bedeutungslos:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(übrigens, hier ist ein Thread mit einigen guten Erklärungen über das, was "POD-Typ" eigentlich bedeutet:

Es gibt viele Missverständnisse in den bestehenden Antworten.

Sowohl class und struct deklarieren eine Klasse.

Ja, können Sie Ihren Zugang zu modifizieren Keywords innerhalb der Klassendefinition neu zu ordnen, je nachdem, welches Schlüsselwort, das Sie die Klasse erklären.

Aber jenseits Syntax, die nur Grund einer über den anderen zu wählen, ist Konvention / Stil / Präferenz.

Einige Leute mögen mit der struct Stichwort-Stick für Klassen ohne Mitgliederfunktionen, da die resultierende Definition „sieht aus wie“ eine einfache Struktur aus C.

Ebenso wie einige Leute das class Schlüsselwort für Klassen mit Elementfunktionen und private Daten zu verwenden, weil sie sagt: „Klasse“ auf sie und sieht daher wie Beispiele aus ihrem Lieblingsbuch auf dem objektorientierten Programmierung.

Die Realität ist, dass diese vollständig bis zu Ihnen und Ihrem Team, und es wird buchstäblich keinen Unterschied machen wird, zu Ihrem Programm.

Die folgenden beiden Klassen sind absolut gleichwertig in jeder Hinsicht außer ihren Namen:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Sie können sogar Schlüsselwörter wechseln, wenn erneut deklariert werden:

class Foo;
struct Bar;

(obwohl diese bricht Visual Studio baut wegen Nicht-Konformität, so dass Compiler wird eine Warnung ausgegeben wird, wenn Sie tun dies.)

und die folgenden Ausdrücke beide bewerten, um wahr:

std::is_class<Foo>::value
std::is_class<Bar>::value

Hinweis Verwenden Sie aber, dass Sie die Schlüsselwörter nicht wechseln kann, wenn Neudefinition ; das ist nur, weil (pro Ein-Definition-Regel) Klassendefinitionen über Übersetzungseinheiten duplizieren muß „von der gleichen Folge von Token bestehen“ . Dies bedeutet, dass Sie nicht einmal const int member; mit int const member; austauschen können, und hat nichts mit der Semantik von class oder struct zu tun.

Das einzige Mal, dass ich statt einer Klasse eine Struktur verwenden, wenn ein Funktor Recht vor der Verwendung in einem Funktionsaufruf deklarieren und Syntax für die aus Gründen der Übersichtlichkeit minimieren wollen. z.

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 

Von der C ++ FAQ Lite :

  

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

     

struct und Klasse ist ansonsten funktionell gleichwertig.

     

OK, genug von diesem quietschsauber Techno Gespräch. Emotional, machen die meisten Entwickler eine starke Unterscheidung zwischen einer Klasse und einer Struktur. Eine Struktur fühlt sich einfach wie ein offener Haufen von Bits mit sehr wenig in der Art der Verkapselung oder Funktionalität. Eine Klasse fühlt sich an wie ein lebende und verantwortliches Mitglied der Gesellschaft mit einem intelligenten Dienst, eine starke Einkapselung Barriere, und eine gut definierte Schnittstelle. Da, dass die Konnotation der meisten Menschen schon haben ist, dann sollten Sie das Schlüsselwort struct verwenden, wenn Sie eine Klasse, die nur sehr wenige Methoden hat und öffentliche Daten hat (wie die Dinge sich in gut gestaltete Systeme existieren!), Aber ansonsten sollten Sie vielleicht die Klasse verwenden Stichwort.

Ein Ort, an dem eine Struktur für mich war hilfreich ist, wenn ich ein System, die festen Format Nachrichten ist Empfangen (über sagen, eine serielle Schnittstelle) von einem anderen System. Sie können den Strom von Bytes, die in eine Struktur gegossen, die Ihre Felder definiert, und dann leicht zugreifen Felder aus.

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

Offensichtlich ist dies die gleiche Sache, die Sie in C tun würden, aber ich finde, dass der Overhead mit der Nachricht in eine Klasse zu entschlüsseln ist in der Regel nicht wert.

Sie können „struct“ in C ++ verwenden, wenn Sie eine Bibliothek, deren Innenteile sind C ++ schreiben, aber die API kann entweder durch C oder C ++ Code aufgerufen werden. Sie einfach einen einzigen Header machen, die Strukturen und die globalen API-Funktionen enthält, die Sie sowohl C und C ++ Code, da dies:

// C access Header to a C++ library
#ifdef __cpp
extern "C" {
#endif

// Put your C struct's here
struct foo
{
    ...
};
// NOTE: the typedef is used because C does not automatically generate
// a typedef with the same name as a struct like C++.
typedef struct foo foo;

// Put your C API functions here
void bar(foo *fun);

#ifdef __cpp
}
#endif

Dann können Sie eine Funktionsleiste () in einem C ++ Datei unter Verwendung von C ++ Code schreiben und es von C und den beiden Welten aufrufbar machen können Daten durch die deklarierten Struktur der teilen. Es gibt noch andere Einschränkungen natürlich beim Mischen C und C ++, aber dies ist ein vereinfachtes Beispiel.

Wie jeder sagt, der einzige wirkliche Unterschied ist der Standardzugang. Aber ich besonders struct verwenden, wenn ich nicht jede Art von Verkapselung mit einer einfachen Datenklasse wollen, auch wenn ich einige Hilfsmethoden implementieren. Zum Beispiel, wenn ich brauche etwas wie folgt aus:

struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};

Structs ( PODs ganz allgemein) sind praktisch, wenn Sie einen C-kompatible Schnittstelle mit einer C ++ Implementierung sind die Bereitstellung, da sie über die Sprachgrenzen und Linker-Formate tragbar sind.

Wenn das nicht ein Problem für Sie, dann nehme ich die Verwendung des „struct“ anstelle von „Klasse“ ist ein guter Kommunikator of Intent (wie @ZeroSignal oben gesagt). Structs haben auch berechenbarer Kopieren Semantik, also sind sie für Daten, die Sie nützlich beabsichtigen, auf externe Medien zu schreiben oder über den Draht senden.

Structs ist auch praktisch für verschiedene metaprogramming Aufgaben, wie Züge Vorlagen, die nur ein paar abhängig typedefs aussetzen:

template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

... aber das ist wirklich nur Vorteil, dass sie öffentlich unter Standardschutzniveau struct ...

Für C ++ gibt es wirklich nicht viel Unterschied zwischen den Strukturen und Klassen. Der Hauptfunktions Unterschied besteht darin, dass die Mitglieder einer Struktur standardmäßig öffentlich sind, während sie standardmäßig in den Klassen sind privat. Ansonsten, soweit die Sprache betrifft, so sind sie gleichwertig.

Wie gesagt, neige ich structs in C ++ zu verwenden, wie ich in C # tun, ähnlich dem, was Brian gesagt hat. Structs sind einfache Datencontainer, während Klassen für Objekte verwendet werden, die auf den Daten zusätzlich handeln müssen nur um es zu halten auf.

Um meine eigene Frage (schamlos) zu beantworten, wie bereits erwähnt, die Zugriffsrechte sind der einzige Unterschied zwischen ihnen in C ++.

Ich neige dazu, nur eine Struktur für den Datenspeicher zu verwenden. Ich erlaube es einige Hilfsfunktionen zu erhalten, wenn es Arbeit macht mit den Daten zu erleichtern. Sobald jedoch die Datenflusskontrolle erfordert (dh Getter / Setter, die einen internen Zustand zu erhalten oder schützen) oder beginnt acquring keine größere Funktionalität (im Grunde mehr Objekt-like), wird es ‚Upgrade‘ zu einer Klasse erhalten, um besser Absicht zu kommunizieren.

Sie sind so ziemlich das Gleiche. Dank der Magie von C ++, eine Struktur Funktionen halten kann, verwenden Vererbung erstellt „neue“ verwenden und so auf wie eine Klasse

Der einzige funktionale Unterschied besteht darin, dass eine Klasse mit privaten Zugriffsrechten beginnt, während eine Struktur mit öffentlichem beginnt. Dies ist die Aufrechterhaltung der Abwärtskompatibilität mit C.

In der Praxis habe ich immer structs als Dateninhaber und Klassen als Objekte verwendet wird.

Klasse.

Die Schüler sind standardmäßig privat.

class test_one {
    int main_one();
};

entspricht

class test_one {
  private:
    int main_one();
};

Also, wenn Sie versuchen,

int two = one.main_one();

Wir werden eine Fehlermeldung erhalten: main_one is private, weil seine nicht zugänglich. Wir können lösen sie durch die Initialisierung durch seine öffentliche dh Angabe

class test_one {
  public:
    int main_one();
};

Struct.

Eine Struktur ist eine Klasse, in denen die Mitglieder standardmäßig öffentlich sind.

struct test_one {
    int main_one;
};

Die Mittel main_one ist privat, dh

class test_one {
  public:
    int main_one;
};

Ich verwende structs für die Datenstrukturen, bei denen die Mitglieder jeden Wert annehmen können, ist es einfacher auf diese Weise.

sie sind die gleiche Sache mit verschiedenen Voreinstellungen (standardmäßig privat für class und standardmäßig öffentlich für struct), so in der Theorie sie völlig austauschbar ist.

so, wenn ich will nur ein paar Informationen verpacken, sich zu bewegen, verwende ich eine Struktur, auch wenn ich dort ein paar Methoden setzen (aber nicht viele). Wenn es sich um eine meist opak Sache ist, wo die Hauptanwendung über Methoden wäre, und nicht direkt an die Datenelemente, verwende ich eine volle Klasse.

Structs standardmäßig den Zugang der Öffentlichkeit haben und Klassen standardmäßig über einen privaten Zugang.

Ich persönlich verwende structs für die Datenübertragung Objekte oder als Wertobjekte. Wenn sie als solche verwendet erkläre ich alle Mitglieder als const Modifikation von anderen Code zu verhindern.

Ein Vorteil struct über class ist, dass es eine Zeile Code zu speichern, wenn die Einhaltung „erste öffentliche Mitglieder, dann privat“. In diesem Licht betrachtet, finde ich das Stichwort class nutzlos.

Hier ist ein weiterer Grund für nur struct verwenden und nie class. Einige Code-Stil-Richtlinien für C ++ für Funktionsmakros mit kleinen Buchstaben vorschlagen, das Grundprinzip ist, dass, wenn das Makro in eine Inline-Funktion umgewandelt wird, soll der Name nicht geändert werden muß. Hier gilt das gleiche. Sie haben Ihre schöne C-Stil Struktur und einen Tag, finden Sie heraus, was Sie brauchen einen Konstruktor hinzuzufügen, oder eine bequeme Methode. Haben Sie es zu einem class ändern? Überall?

Die Unterscheidung zwischen structs und classes ist einfach zu viel Mühe, in die Quere, was zu tun, wir tun sollten - Programmierung. Wie so viele von C ++ 's Problemen, entsteht es aus dem starken Wunsch nach rückwärts Kompatibilität.

Technisch sind beide gleich in C ++ -. Zum Beispiel ist es möglich, eine Struktur Betreiber usw. überlastet zu

Allerdings:

I structs verwenden, wenn ich Informationen mehrerer Typen übergeben will gleichzeitig Ich benutze Klassen, wenn die ich mit einem „funktionellen“ Objekt zu tun habe.

Hoffe, es hilft.

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

Zum Beispiel, ich bin in dem get eine Struktur Student Rückkehr ... () -Methoden hier -. Genießen

  

Wann möchten Sie wählen Struktur verwenden,   und wenn die Klasse in C ++ verwenden?

Ich benutze struct wenn ich functors und POD definieren. Ansonsten verwende ich class.

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};

I structs verwenden, wenn ich POD-Typ oder Funktors erstellen müssen.

Alle Klassenmitglieder sind standardmäßig privat und alle Strukturkomponenten standardmäßig öffentlich. Klasse hat private Standard Basen und Struct hat öffentliche Basen Standard. Struct bei C kann nicht Mitglied Funktionen hat, wo wie im Fall von C ++ wir Member-Funktionen hinzugefügt werden auf die Struktur haben können. Anders als diese Unterschiede, ich habe nichts überraschend über sie finden.

Ich dachte, dass Structs als Datenstruktur bestimmt wurde (wie ein Multi-Datentyp Array von Informationen) und Klassen wurden Code Verpackung (wie Sammlungen von Subroutinen und Funktionen) der bestimmungsgemäßen ..

(

ich nie "struct" in C ++ verwenden.

Ich kann nicht immer ein Szenario vorstellen, in dem Sie eine Struktur verwenden würden, wenn Sie private Mitglieder wollen, es sei denn, Sie absichtlich verwirrend zu sein versuchen.

Es scheint, dass structs mit mehr einer syntaktischen Indikation dafür, wie die Daten verwendet werden, aber ich würde lieber nur eine Klasse machen und versuchen, dass explizit im Namen der Klasse zu machen, oder durch Kommentare.

z.

class PublicInputData {
    //data members
 };
scroll top