Når bør du bruke en klasse vs en struct i C ++?

stemmer
730

I hvilke situasjoner er det bedre å bruke en structvs en classi C ++?

Publisert på 10/09/2008 klokken 16:29
kilden bruker
På andre språk...                            


25 svar

stemmer
627

Forskjeller mellom en classog en structi C ++ er at structs har standard publicmedlemmer og baser og klasser har standard privatemedlemmer og baser. Begge klasser og structs kan ha en blanding av public, protectedog privatemedlemmer, kan bruke arv og kan ha medlemsfunksjoner.

Jeg vil anbefale å bruke structs som vanlig gamle datastrukturer uten klasse har, og bruke klasser som aggregerte datastrukturer med privatedata og medlemsfunksjoner.

Svarte 10/09/2008 kl. 16:35
kilden bruker

stemmer
174

Som alle andre bemerker det er egentlig bare to faktiske språkforskjeller:

  • structstandard til offentlig innsyn og classstandard til privat adkomst.
  • Når arve, structtil standard publicarv og classstandard til privatearv. (Ironisk nok, som med så mange ting i C ++, er standard bakover: publicarv er langt mer vanlig valg, men folk sjelden erklære structs bare for å spare på å skrive " public" søkeord.

Men den virkelige forskjellen i praksis mellom en class/ structsom erklærer en konstruktør / destructor og en som ikke gjør det. Det er visse garantier til en "ren gamle-data" POD type, som ikke lenger gjelder når du tar over klassen konstruksjon. For å holde dette skillet klart, mange mennesker bevisst bare bruke structs for POD typer, og hvis de kommer til å legge noen metoder i det hele tatt, kan du bruke classes. Forskjellen mellom de to fragmenter under ellers er meningsløst:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Forresten, her er en tråd med noen gode forklaringer om hva "POD type" egentlig betyr: ? Hva er POD typer i C ++ )

Svarte 28/07/2009 kl. 04:02
kilden bruker

stemmer
93

Det er mange misforståelser i de eksisterende svarene.

Både classog structerklære en klasse.

Ja, du må omorganisere tilgang modifisere ordene inne i klassedefinisjonen, avhengig av hvilke søkeord du brukte til å erklære klassen.

Men utover syntaks, den eneste grunnen til å velge en over den andre er konvensjonen / stil / preferanser.

Noen mennesker liker å feste med structnøkkelordet for klassene uten medlemsfunksjoner, fordi den resulterende definisjon "ser ut som" en enkel struktur fra C.

Tilsvarende noen mennesker liker å bruke classsøkeordet for klasser med medlems funksjoner og privatedata, fordi det står "klasse" på den, og derfor ser ut som eksempler fra deres favoritt bok på objektorientert programmering.

Realiteten er at dette helt opp til deg og laget ditt, og det vil gjøre bokstavelig talt ingen forskjell overhodet til programmet.

Følgende to klasser er helt tilsvarende på alle måter bortsett fra navnet sitt:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Du kan også slå søkeord når redeclaring:

class Foo;
struct Bar;

(selv om noen kompilatorer vil avgi en advarsel når du gjør dette, under forutsetning av at du sannsynligvis ikke har tenkt å gjøre noe så forvirrende, og at du derfor bli bedt om å dobbeltsjekke koden din.)

og følgende uttrykk både vurdere å true:

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

Gjør oppmerksom på, men at du ikke kan bytte søkeordene når omdefinerer ; Dette er bare fordi (i henhold til en definisjon regel) duplikat klassedefinisjoner tvers oversettingsheter må "bestå av den samme sekvens av symboler" . Dette betyr at du kan ikke engang utveksle const int member;med int const member;, og har ingenting å gjøre med semantikk classeller struct.

Svarte 28/04/2016 kl. 14:17
kilden bruker

stemmer
50

Den eneste gangen jeg bruker en struct i stedet for en klasse er når erklære en funktor rett før du bruker den i et funksjonskall og ønsker å minimere syntaks for ordens skyld. f.eks:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 
Svarte 10/09/2008 kl. 18:08
kilden bruker

stemmer
30

Fra C ++ FAQ Lite :

Medlemmene og base klasser av en struct er offentlige som standard, mens i klassen, de som standard private. Merk: Du bør lage din grunnklasser eksplisitt offentlige, private eller beskyttet, snarere enn å stole på standardinnstillingene.

struct og klasse er ellers tilsvarende funksjonalitet.

OK, nok av at squeaky ren techno snakke. Følelsesmessig, de fleste utviklere gjør et sterkt skille mellom en klasse og en struct. En struct bare føles som en åpen haug av biter med svært lite i veien for innkapsling eller funksjonalitet. En klasse føles som en levende og ansvarlig samfunnsaktør med intelligente tjenester, en sterk innkapsling barriere, og en veldefinert grensesnitt. Siden det er betydningen de fleste allerede har, bør du sannsynligvis bruke struct søkeord hvis du har en klasse som har svært få metoder og har offentlige data (slike ting finnes i godt utviklet systemer!), Men ellers bør du nok bruke klassen søkeord.

Svarte 28/07/2009 kl. 04:07
kilden bruker

stemmer
19

Ett sted hvor en struct har vært nyttig for meg er når jeg har et system som er mottar faste meldingene format (i løpet av si, en seriell port) fra et annet system. Du kan kaste den strøm av bytes i en struct som definerer dine felt, og deretter enkelt få tilgang til feltene.

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);
}

Dette er selvsagt det samme du ville gjort i C, men jeg synes at overhead for å måtte dekode meldingen i en klasse er vanligvis ikke verdt det.

Svarte 10/09/2008 kl. 16:43
kilden bruker

stemmer
15

Du kan bruke "struct" i C ++ hvis du skriver et bibliotek som innvendige er C ++ men API kan kalles enten C eller C ++ kode. Du bare gjøre et enkelt header som inneholder structs og globale API funksjoner som du utsettes for både C og C ++ kode som dette:

// 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

Deretter kan du skrive en funksjon bar () i en C ++ fil ved hjelp av C ++ koden og gjøre det oppsigelige fra C og de to verdener kan dele data gjennom erklært struct-tallet. Det er andre begrensninger selvfølgelig når blande C og C ++, men dette er et forenklet eksempel.

Svarte 27/10/2009 kl. 01:50
kilden bruker

stemmer
9

Som hver og en sier, er den eneste virkelige forskjellen standard tilgangs. Men jeg bruker spesielt struct når jeg ikke ønsker noen form for innkapsling med en enkel data klasse, selv om jeg gjennomføre noen hjelpemetoder. For eksempel må da jeg noe sånt som dette:

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

    int length() {return x+y+z;}
};
Svarte 28/07/2009 kl. 16:13
kilden bruker

stemmer
9

Structs ( pods , mer generelt) er hendig når du gir en C-kompatibelt grensesnitt med C ++ gjennomføring, siden de er portable på tvers av språkgrenser og linker formater.

Hvis det ikke er en bekymring for deg, så jeg antar at bruken av "struct" i stedet for "klasse" er en god kommunikator intensjonsavtale (som @ZeroSignal sagt ovenfor). Structs har også mer forutsigbare kopiering semantikk, så de er nyttige for data du har tenkt å skrive til eksterne medier eller sende over ledningen.

Structs er også nyttig for ulike metaprogramming oppgaver, som trekk maler som bare utsetter en haug av avhengige typedefs:

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

... men det er egentlig bare å dra nytte av struct standard beskyttelsesnivået være offentlig ...

Svarte 10/09/2008 kl. 17:46
kilden bruker

stemmer
7

For C ++, det er virkelig ikke mye av en forskjell mellom structs og klasser. Den viktigste funksjonelle forskjellen er at medlemmer av en struct er offentlige som standard, mens de er private som standard i klasser. Ellers så langt som språket er bekymret, de er likeverdige.

Når det er sagt, jeg pleier å bruke structs i C ++ som jeg gjør i C #, i likhet med hva Brian har sagt. Structs er enkle data beholdere, mens klasser anvendes for gjenstander som må virke på dataene i tillegg til bare å holde på den.

Svarte 10/09/2008 kl. 16:36
kilden bruker

stemmer
5

For å svare på mitt eget spørsmål (skamløst), som allerede nevnt, tilgangsrettigheter er den eneste forskjellen mellom dem i C ++.

Jeg har en tendens til å bruke en struct for bare data-lagring. Jeg skal la det bli noen hjelpefunksjoner om det gjør arbeidet med dataene enklere. Men så snart dataene krever flytkontroll (dvs. getters / settere som opprettholder eller beskytter en intern tilstand) eller begynner acquring noen større funksjonalitet (i utgangspunktet mer objekt-lignende), det vil bli 'oppgradert' til en klasse for å bedre kommunisere hensikten.

Svarte 10/09/2008 kl. 16:50
kilden bruker

stemmer
4

De er ganske mye det samme. Takket være den magiske C ++, kan en struct holde funksjoner, bruk arv, opprettet ved hjelp av "nye" og så videre, akkurat som en klasse

Den eneste funksjonelle forskjellen er at en klasse begynner med private rettigheter, mens en struct begynner med publikum. Dette er den opprettbakoverkompatibilitet med C.

I praksis har jeg alltid brukt structs som dataeierne og klasser som objekter.

Svarte 10/09/2008 kl. 16:36
kilden bruker

stemmer
2

Klasse.

Klassemedlemmene er private som standard.

class test_one {
    int main_one();
};

Tilsvarer

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

Så hvis du prøver

int two = one.main_one();

Vi vil få en feilmelding: main_one is privatefordi det er ikke tilgjengelig. Vi kan løse det ved å initialisere den ved å angi en offentlig dvs.

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

Struct.

En struct er en klasse der medlemmene er offentlige som standard.

struct test_one {
    int main_one;
};

Midler main_oneer privat dvs.

class test_one {
  public:
    int main_one;
};

Jeg bruker structs for datastrukturer der medlemmene kan ta noen verdi, det er enklere på den måten.

Svarte 07/11/2017 kl. 22:41
kilden bruker

stemmer
2

Structs som standard har offentlig tilgang og klasser som standard har privat tilgang.

Personlig bruker jeg structs for dataoverføring objekter eller som verdi Objects. Når den anvendes som sådan jeg erklære alle medlemmer som const for å forhindre endringer av annen kode.

Svarte 28/07/2009 kl. 03:51
kilden bruker

stemmer
2

de er det samme med forskjellige mislighold (private som standard for class, og offentlige som standard for struct), så i teorien de er helt utskiftbare.

så, hvis jeg bare vil pakke litt info å bevege seg rundt, jeg bruker en struct, selv om jeg setter noen metoder der (men ikke mange). Hvis det er en stort sett tette ting, hvor den viktigste bruken vil være via metoder, og ikke direkte til data medlemmer, jeg bruker en hel klasse.

Svarte 28/07/2009 kl. 03:49
kilden bruker

stemmer
1

Alle klassemedlemmene er private som standard, og alle struct medlemmer er offentlige som standard. Klasse har standard private baser og Struct har standard offentlige baser. Struct i tilfelle av C kan ikke ha medlemsfunksjoner der som i tilfelle av C ++ vi kan ha medlemsfunksjoner blir lagt til struct. Annet enn disse forskjellene, finner jeg ikke noe overraskende om dem.

Svarte 15/10/2018 kl. 16:32
kilden bruker

stemmer
1

Som andre har påpekt

  • begge er tilsvarende bortsett fra standard synlighet
  • det kan være grunn til å bli tvunget til å bruke den ene eller den andre uansett grunn

Det er en klar anbefaling om når du skal bruke som fra Stroustrup / Sutter:

Bruk klassen hvis klassen har en invariant; Bruk struct hvis datamedlemmer kan variere uavhengig av hverandre

Men husk at det ikke er lurt å videresende olle sth. som en klasse ( class X;) og definere det som struct ( struct X { ... }). Det kan fungere på noen forbindelsesledd (f.eks g ++) og kan mislykkes på andre (f.eks MSVC), så vil du finne deg selv i utvikler helvete.

Svarte 17/09/2018 kl. 11:05
kilden bruker

stemmer
1

En fordel med structløpet classer at det sparer en linje med kode, hvis man følger til "første offentlige medlemmer, deretter privat". I lys av dette, finner jeg søkeordet classubrukelig.

Her er en annen grunn til å bruke bare structog aldri class. Noen retningslinjer kode stil for C ++ foreslår å bruke små bokstaver for funksjonsmakroer, begrunnelsen er at når makro konverteres til en inline funksjon, bør navnet ikke trenger å endres. Samme her. Du har din fine C-stil struct og en dag, finner du ut at du må legge til en konstruktør, eller noen praktiske metoden. Har du endre den til en class? Overalt?

Skille mellom structs og classes er litt for mye styr, å komme inn i måten å gjøre det vi skal gjøre - programmering. Som så mange av C ++ 's problemer oppstår det ut av sterkt ønske om bakover kompatibilitet.

Svarte 14/11/2017 kl. 21:08
kilden bruker

stemmer
1

Jeg bruker structs når jeg trenger for å lage POD type eller funktor.

Svarte 15/09/2016 kl. 09:30
kilden bruker

stemmer
1

Når ønsker du velger å bruke struct og når man skal bruke klassen i C ++?

Jeg bruker structnår jeg definerer functorsog POD. Ellers bruker jeg 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; }
};
Svarte 28/07/2009 kl. 20:40
kilden bruker

stemmer
1

Teknisk begge er den samme i C ++ - for eksempel det er mulig for en struct å ha overbelastet operatører etc.

Derimot :

Jeg bruker structs når jeg ønsker å sende informasjon fra flere typer samtidig bruker jeg klasser når jeg arbeider med en "funksjonell" objekt.

Håper det hjelper.

#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;
};

For eksempel, jeg returnerer en struct student i get ... () metoder enn her - nyt.

Svarte 28/07/2009 kl. 04:42
kilden bruker

stemmer
0

Jeg bruker struct bare når jeg må holde noen data uten medlemsfunksjoner i tilknytning til den (for å operere på medlemsdata), og for å få tilgang til datavariable direkte.

F.eks: lesing / skriving av data fra filer og socket bekker osv Passing funksjonsargumenter i en struktur der funksjonsargumenter er for mange og funksjon syntaks ser for lang.

Teknisk sett er det ingen stor forskjell mellom klasse og struture unntatt standard tilgjengelighets. Mer over det avhenger av programmeringsstil hvordan du bruker den.

Svarte 28/07/2009 kl. 04:29
kilden bruker

stemmer
-3

Jeg trodde at Structs var ment som en datastruktur (som en multi-datatype utvalg av informasjon) og klasser ble inteded for Kode Emballasje (som samlinger av subrutiner og funksjoner) ..

:(

Svarte 28/07/2009 kl. 04:07
kilden bruker

stemmer
-5

Jeg bruker aldri "struct" i C ++.

Jeg kan aldri tenke meg et scenario der du ville bruke en struct når du ønsker private medlemmer, med mindre du forsettlig prøver å være forvirrende.

Det virker som du bruker structs er mer av en syntaktisk indikasjon på hvordan dataene vil bli brukt, men jeg vil heller bare lage en klasse og prøve å gjøre det eksplisitt i navnet på klassen, eller gjennom kommentarer.

Eg

class PublicInputData {
    //data members
 };
Svarte 10/09/2008 kl. 18:02
kilden bruker

stemmer
-7

Tilgang til funksjoner er ikke den eneste forskjellen mellom structs og klasser. En struct er bedre for POD (Plain Old data) typer, siden det er enklere å administrere for kompilatoren og programmerer. For nybegynnere som ikke bruker objektorientert programmering, ved hjelp av en struct er fine.

Svarte 21/02/2014 kl. 18:58
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more