Hva er forskjellene mellom struct og klasse i C ++?

stemmer
385

Dette spørsmålet ble allerede spurt i forbindelse med C # /. Net .

Nå har jeg lyst til å lære forskjellene mellom en struct og en klasse i C ++. Diskuter de tekniske forskjellene, samt grunner til å velge den ene eller den andre i OO design.

Jeg begynner med en åpenbar forskjell:

  • Hvis du ikke spesifiserer public:eller private:medlemmer av en struct er offentlige som standard; medlemmer av en klasse er private som standard.

Jeg er sikker på at det er andre forskjeller som finnes i obskure hjørner av C ++ spesifikasjonen.

Publisert på 18/09/2008 klokken 14:09
kilden bruker
På andre språk...                            


30 svar

stemmer
431

Du glemmer den vanskelige andre forskjellen mellom klasser og structs.

Quoth standard (§11.2.2 i C ++ 98 til og med C ++ 11):

I fravær av en tilgangs-spesifiserendes for en basisklasse, blir offentlig forutsettes da utledet klasse er erklært struct og privat forutsettes når klassen er erklært klasse .

Og bare for fullstendighets skyld, er mer allment kjent forskjellen mellom klasse og struct definert i (11.2):

Medlem av en klasse definert med søkeordet klassen er private som standard. Medlemmer av en klasse definert med søkeord struct eller forening er offentlige som standard.

Ytterligere forskjell: nøkkelordet classkan brukes til å erklære malparameterne, mens structsøkeordet ikke kan så brukes.

Svarte 16/06/2009 kl. 06:19
kilden bruker

stemmer
147

Siterer The C ++ FAQ ,

[7,8] Hva er forskjellen mellom søkeordene struct og klasse?

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 18/09/2008 kl. 14:18
kilden bruker

stemmer
103

Det er verdt å huske C ++ 's opprinnelse i, og kompatibilitet med, C.

C har structs, det har ingen oppfatning av innkapsling, så alt er offentlig.

Å være offentlig standard er generelt ansett som en dårlig idé når du tar et objekt-orientert tilnærming, så i å lage en form for C som er opprinnelig bidrar til OOP (du kan gjøre OO i C, men det vil ikke hjelpe deg) som var den ideen i C ++ (opprinnelig "C med klasser"), er det fornuftig å gjøre medlemmene private som standard.

På den annen side, hvis Stroustrup hadde endret semantikk av structslik at medlemmene var private som standard, ville det ha brutt kompatibilitet (det er ikke lenger så ofte sant som standardene avvek, men alle gyldige C-programmer var også gyldige C ++ programmer, som hadde en stor effekt på å gi C ++ fotfeste).

Så et nytt søkeord, classble innført for å være akkurat som en struct, men private som standard.

Hvis C ++ hadde kommet fra bunnen av, med ingen historie, så ville det sannsynligvis ha bare ett slikt søkeord. Det er også trolig ikke ville ha gjort virkningen det gjort.

Generelt vil folk har en tendens til å bruke struct når de gjør noe som hvordan structs brukes i C; offentlige medlemmer, ingen konstruktør (så lenge det ikke er i en union, du kan ha konstruktører i structs, akkurat som med klasser, men folk har en tendens til ikke å), ingen virtuelle metoder osv Siden språk er så mye å kommunisere med folk leser koden som å instruere maskiner (eller annet vi vil holde fast med montering og rå VM opcodes) er det en god idé å holde seg til dette.

Svarte 07/08/2010 kl. 23:17
kilden bruker

stemmer
30

Klasse medlemmer er private som standard. Struct medlemmer er offentlige som standard. Foruten at det er ingen andre forskjeller. Se også dette spørsmålet .

Svarte 18/09/2008 kl. 14:12
kilden bruker

stemmer
26

Ifølge Stroustrup i C ++ Programming Language :

Hvilken stil du bruker, avhenger av omstendighetene og smak. Jeg vanligvis foretrekker å bruke structfor klasser som har all data publikum. Jeg tenker på slike klasser som "ikke helt riktig typer, bare datastrukturer."

Funksjonelt er det ingen forskjell annet enn offentlig / privat

Svarte 18/09/2008 kl. 14:15
kilden bruker

stemmer
8

STRUCT er en type av abstrakte datatype som deler opp en gitt mengde minne i henhold til strukturen spesifikasjonen. Structs er spesielt nyttig i filen serie / deserialization som strukturen kan ofte bli skrevet til filen ordrett. (Dvs. Skaffe en peker til struct, bruker SIZE makroen for å beregne det antall bytes som skal kopieres, og deretter flytte dataene i eller ut av struct).

Klassene er en annen type abstrakt datatype som forsøker å sikre informasjon skjul. Internt, kan det være en rekke maskinismer, metoder, temp variabler, tilstandsvariabler. etc. som alle brukes til å presentere en konsekvent API til en kode som ønsker å bruke klassen.

I praksis structs er om data, klasser er om kode.

Men trenger du å forstå at dette er bare abstraksjoner. Det er fullt mulig å lage structs som ser mye som klasser og klasser som ser mye som structs. Faktisk, de tidligste C ++ kompilatorer bare var pre-kompilatorer som overs C ++ kode til C. Dermed disse abstraksjoner er en fordel for logisk tenkning, ikke nødvendigvis en ressurs for selve datamaskinen.

Utover det faktum at hver enkelt er en annen type av abstraksjon, klasser gir løsninger på C-kode navngiving puslespillet. Siden du ikke kan ha mer enn én funksjon eksponert med samme navn, utviklere brukes til å følge et mønster av _ (). f.eks mathlibextreme_max (). Ved å gruppere APIer inn i klasser, tilsvarende funksjoner (her kaller vi dem "metoder") kan grupperes sammen og beskyttet mot navngiving av metoder i andre klasser. Dette gjør at programmerer å organisere koden sin bedre og øke gjenbruk av kode. I teorien, minst.

Svarte 18/09/2008 kl. 14:23
kilden bruker

stemmer
8

Den eneste andre forskjellen er standard arv av klasser og structs, som, ikke overraskende, er privat og offentlig hhv.

Svarte 18/09/2008 kl. 14:15
kilden bruker

stemmer
7

1) Medlemmer av en klasse er private som standard, og medlemmer av struct er offentlige som standard.

For eksempel program en mislykkes i kompilering og program 2 fungerer fint.

// 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) Når utlede en struct fra en klasse / struct, er standard tilgangs-specifier for en base klasse / struct publikum. Og da utlede en klasse, er standard tilgangs Specifier privat.

For eksempel program 3 svikter i kompilering og program 4 fungerer fint.

// 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;
}
Svarte 24/07/2015 kl. 05:44
kilden bruker

stemmer
4
  1. Medlemmene av en struktur er offentlige som standard, medlemmer av klassen er private som standard.
  2. Standard arv for struktur fra en annen struktur eller klasse er public.Default arv for klasse fra en annen struktur eller klasse er 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;
}

Dette er på VS2005.

Svarte 19/09/2008 kl. 10:12
kilden bruker

stemmer
4

En annen ting å merke seg hvis du oppdaterte en arv app som hadde structs å bruke klasser du kan kjøre inn følgende problem:

Gamle koden har structs, kode ble ryddet opp og disse endret til klasser. En virtuell funksjon eller to ble deretter tilsatt til den nye oppdaterte klassen.

Når virtuelle funksjoner er i klassene da internt kompilatoren vil legge ekstra peker til klasse data til å peke til funksjonene.

Hvordan dette ville bryte gamle arven kode er hvis du er i den gamle koden et sted struct ble ryddet ved hjelp memfill å fjerne det hele til nuller, ville dette trampe ekstra pekeren data også.

Svarte 18/09/2008 kl. 15:31
kilden bruker

stemmer
4

Ikke i spesifikasjonen, nei. Den største forskjellen er i programmerer forventninger når de leser koden din i 2 år. structs er ofte antatt å være POD. Structs er også brukt i malen metaprogramming når du definerer en type for andre enn definere gjenstander formål.

Svarte 18/09/2008 kl. 14:15
kilden bruker

stemmer
3

En annen viktigste forskjellen er når det kommer til maler. Så vidt jeg vet, kan du bruke en klasse når du definerer en mal, men ikke en struct.

template<class T> // OK
template<struct T> // ERROR, struct not allowed here
Svarte 12/11/2011 kl. 11:21
kilden bruker

stemmer
2
  1. Medlem av en klasse definert med søkeordet classer privatesom standard. Medlemmer av en klasse definert med søkeordene struct(eller union) er publicsom standard.

  2. I fravær av en adgangs spesifiserendes for en basisklasse, publicblir lagt til grunn ved den avledede klassen er deklarert structog privateer antatt når klassen er deklarert class.

  3. Du kan erklære en enum class, men ikke en enum struct.

  4. Du kan bruke template<class T>, men ikke template<struct T>.

Merk også at C ++ standarden gjør det mulig å videresende-erklære en type som en struct, og deretter bruke classnår erklære type og vice-versa. Dessuten std::is_class<Y>::valueer truefor Y er en structog en class, men er falsefor en enum class.

Svarte 19/12/2018 kl. 14:00
kilden bruker

stemmer
2
  • . I klasser alle medlemmene som standard er privat, men i strukturmedlemmer er offentlige som standard.

    1. Det er ingen begrep som konstruktør og destructor for structs, men for klasse kompilatoren skaper standard hvis du ikke gir.

    2. Sizeof tom struktur er 0 Bytes wer som sizeof tom klasse er en Byte Den struct standard tilgangstype er offentlig. En struct bør typisk bli anvendt for gruppering av data.

    Standard klassen tilgangstype er privat, og standardmodus for arv er privat. En klasse skal brukes til å gruppere data og metoder som opererer på disse dataene.

    Kort sagt, er konvensjonen å bruke struct når formålet er å gruppere data, og bruke klasser når vi krever data abstraksjon og, kanskje arv.

    I C ++ strukturer og klasser er vedtatt av verdi, med mindre eksplisitt de-referert. På andre språk klasser og bygninger kan ha forskjellige semantikk - ie. objekter (forekomster av klasser) kan bli passert av referanse og strukturer kan bli passert av verdi. Merk: Det er kommentarer knyttet til dette spørsmålet. Se en diskusjonsside for å legge til samtalen.

Svarte 10/07/2012 kl. 19:07
kilden bruker

stemmer
1

Mens antydet av andre svar, det er ikke eksplisitt nevnt - at structs er C-kompatibel, avhengig av bruk; klasser er det ikke.

Dette betyr at hvis du skriver en overskrift som du ønsker å være C kompatibel så du har ikke noe valg annet enn struct (som i C verden ikke kan ha funksjoner, men kan ha funksjonspekere).

Svarte 29/09/2016 kl. 11:38
kilden bruker

stemmer
1

De andre svarene har nevnt de private / offentlige mislighold, (men merk at en struct er en klasse er en struct, de er ikke to ulike elementer, bare to måter å definere det samme elementet).

Hva som kan være interessant å merke seg (spesielt siden det anmodet vil trolig være å bruke MSVC ++ siden han nevner "uovervåkede" C ++) er at Visual C ++ klager under visse omstendigheter hvis en klasse er deklarert med classog deretter definert med struct(eller muligens omvendt ), selv om standarden sier det er helt lovlig.

Svarte 04/08/2011 kl. 14:25
kilden bruker

stemmer
1

ISO IEC 14882-2003

9 klasser

§3

En struktur er en klasse som er definert med klasse-nøkkel struct ; medlemmer og grunnklasser (punkt 10) er offentlig tilgjengelig som standard (punkt 11).

Svarte 18/04/2010 kl. 09:18
kilden bruker

stemmer
1

Det er bare en konvensjon. Structs kan opprettes for å holde enkle data, men senere utvikle seg tid med tillegg av medlem funksjoner og konstruktører. På den annen side er det uvanlig å se noe annet enn offentlig: tilgang i en struct.

Svarte 18/09/2008 kl. 14:17
kilden bruker

stemmer
1

Her er en god forklaring: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

Så, en gang: i C ++, er en struct identisk med en klasse bortsett fra at medlemmer av en struct har offentlig synlighet som standard, men medlemmer av en klasse har egen synlighet som standard.

Svarte 18/09/2008 kl. 14:13
kilden bruker

stemmer
0

Forskjellen mellom classog structer en forskjell mellom søkeord, ikke mellom datatyper. denne to

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

begge definerer en klasse type. Forskjellen av søkeordene i denne sammenheng er det forskjellige standard tilgangs:

  • foo::xer offentlig og foo_baseer arvet offentlig
  • bar::xer privat og bar_baseer arvet privat
Svarte 19/06/2019 kl. 23:35
kilden bruker

stemmer
-1

Du kan vurdere dette for retningslinjer for når man skal gå for struct eller klasse, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .

√ VURDER definerer en struct i stedet for en klasse hvis forekomster av den type som er små og vanligvis kortvarig og er vanligvis innleiret i andre gjenstander.

X Unngå å definere en struct med mindre typen har alle de følgende egenskaper:

Det representerer logisk en enkelt verdi, lik den primitive typer (int, dobbel, etc.).

Den har en forekomst størrelse under 16 bytes.

Det er uforanderlig.

Det trenger ikke å være innrammet ofte.

Svarte 01/05/2015 kl. 12:30
kilden bruker

stemmer
-1

Klassen er bare meningsfull i sammenheng med software engineering. I sammenheng med datastrukturer og algoritmer, klasse og struct ikke er så forskjellige. Det er ingen hvilken som helst regel begrenset at klassens medlem må refereres.

Ved utvikling av stort prosjekt med tonnevis av mennesker uten klasse, kan du endelig få komplisert kombinert kode fordi alle bruker det funksjoner og data de ønsker. klasse gir tillatelse kontroller og inherents å forbedre avkobling og gjenbruk koder.

Hvis du leser noen software engineering prinsipper, finner du de fleste standarder kan ikke gjennomføres enkelt uten klasse. for eksempel: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

Forresten, Når en struct tildeler en knasing av hukommelse og omfatter flere variable, verdi typen variabler indikerer at verdiene er embbeded i hvor struct fordeles. I motsetning til dette referansetypen variable verdier er utvendig og referanse ved en peker som også er innleiret i hvor struct fordeles.

Svarte 16/03/2015 kl. 16:49
kilden bruker

stemmer
-1

Ut av alle disse faktorene, kan det konkluderes med at konseptet klasse er godt egnet til å representere virkelige verden objekter snarere enn "Structures" .Largely fordi OOP begreper som brukes i klassen er svært praktisk for å forklare virkelige verden scenarier derfor lettere å flette dem til virkelighet. for eksempel er standard arv offentlig for structs men hvis vi bruker denne regelen for virkelige verden, er det ridiculous.But i standardklassen arv er private som er mer realistisk.

Anyways, det jeg trenger å rettferdig er Class er en mye bredere, virkelige verden er aktuelt konsept mens Struktur er en primitiv Concept med dårlig intern organisering (eventhough struct følger OOP konsepter, de har en dårlig mening)

Svarte 27/08/2013 kl. 01:22
kilden bruker

stemmer
-1

Forskjellen mellom struct og klasse søkeord i C ++ er at når det er ingen spesifikk specifier på spesielt sammensatte datatype så som standard struct eller forening er den offentlige søkeordene som bare anser data skjule, men klassen er privat søkeord som vurderer å skjule programmet koder eller data. Alltid noen programmerere bruke struct for data og klasse for kode skyld. For mer informasjon ta kontakt med andre kilder.

Svarte 15/04/2013 kl. 13:57
kilden bruker

stemmer
-2

Hovedforskjellen mellom struct og klasse er den i struct kan man bare deklarere datavariable av forskjellige datatyper, mens i klasse kan man deklarere datavariable, medlemsfunksjoner og dermed kan manipulere datavariable gjennom funksjonene.

-> En hendig ting som jeg finner i klassen vs struct er at mens implementere filer i et program hvis du ønsker å gjøre noen driften av en struct igjen og igjen på hvert nytt sett av operasjoner du trenger for å lage en egen funksjon, og du må passere gjenstand for struct etter å ha lest den fra filen slik som å gjøre noen operasjoner på den. mens i klassen hvis du gjør en funksjon som gjør noen operasjoner på dataene som trengs everytime..its enkelt er det bare å lese objektet fra fil og kaller funksjonen ..

Men det depennds på programmereren hvilken vei han / hun finner passende ... i henhold til meg jeg foretrekker klasse hver gang bare fordi den støtter OOPS og dvs grunnen til at det er implementert i nesten alle språk og sin fantastiske funksjonen av all tid programmering, - )

Og ja det mest unforgotten forskjellen jeg glemte å nevne er at klassen støtter data skjul og også støtter operasjoner som er utført på bygget i datatyper, mens struct doesnt!

Svarte 09/06/2017 kl. 13:14
kilden bruker

stemmer
-2

Jeg ser en annen forskjellig mellom structs og klasser som har å gjøre med standard initialisering.

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

Kjør denne koden og undersøke myTester. Du vil finne at for m_Foo, struct har m_Foo.a blitt initialisert til 0, men for m_Bar, klassen, er m_Bar.a initialisert. Så det ser ut til å være en forskjell i hva standardkonstruktør gjør for struct vs. klasse. Jeg ser dette med Visual Studio.

Svarte 15/07/2015 kl. 18:21
kilden bruker

stemmer
-2

Hovedforskjellen mellom struktur og klasse ordet i Oj, er det, ingen offentlig og privat medlem erklæring til stede i structure.and data og medlem funksjon kan defineres som offentlig, privat så vel som beskyttet.

Svarte 28/01/2014 kl. 19:50
kilden bruker

stemmer
-2

Jeg fant en annen forskjell. Hvis du ikke definerer en konstruktør i en klasse, vil kompilatoren definere en. men i en struct hvis du ikke definerer en konstruktør, kompilatoren ikke definerer en konstruktør også. så i noen tilfeller at vi egentlig ikke trenger en konstruktør, er struct et bedre valg (ytelse tip). og beklager for meg dårlig engelsk.

Svarte 04/08/2011 kl. 13:28
kilden bruker

stemmer
-3

Klassene er referansetyper og strukturer er verdier typer.
Når jeg sier Klassene er referansetyper,
i utgangspunktet de vil inneholde adressen til en forekomst variabler.

For eksempel:

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.
}

Ved hovedfremgangsmåten,
kan jeg opprette en forekomst av denne klasse ved hjelp av ny operatør som tildeler hukommelse for denne klassen
og lagrer basisadressen av den til MyClass type variabel (_myClassObject2).

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

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

I de ovennevnte program, MyClass _myClassObject2 = _myClassObject1; instruksjon indikerer at begge variabler av typen MyClass

  1. myClassObject1
  2. myClassObject2

og vil peke på den samme minneområde.
Det utgangspunktet tildeler samme minneplassen til en annen variabel av samme type.

Så hvis noen endringer som vi gjør i noen av gjenstandene skriver MyClass vil ha en effekt på en annen
siden begge peker til samme minneområde.

"_myClassObject1.DataMember = 10;" på denne linje både gjenstandens datamedlemmer vil inneholde verdi på 10.
"_myClassObject2.DataMember = 20;" på denne linje både gjenstandens data medlem vilje inneholder verdien på 20.
Til slutt, vi har tilgang til datamembers av et objekt gjennom pekere.

I motsetning til klasser, strukturer er verdityper. For eksempel:

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

I de ovennevnte program,
Instantiating gjenstand for MyStructure type med ny operatør og
lagring av adressen i _myStructObject variabel av typen MyStructure og
tilordning av verdi 10 til data medlem av strukturen ved bruk av "_myStructObject1.DataMember = 10".

I neste linje,
jeg forkynner en annen variabel _myStructObject2 av type MyStructure og tildele _myStructObject1 inn i det.
Her .NET C # kompilatoren skaper en annen kopi av _myStructureObject1 objekt og
tildeler den lagerplass i MyStructure variabel _myStructObject2.

Så uansett hva endringen vi gjør på _myStructObject1 aldri vil ha en effekt på en annen variabel _myStructObject2 av type MyStructrue.
Det er derfor vi sier Strukturer er verdityper.

Så den umiddelbare Base klasse for klasse er Object og umiddelbar Base klasse for Struktur er ValueType som arver fra Object.
Klassene vil støtte en arv mens Structures vil ikke.

Hvordan skal vi si det?
Og hva er årsaken bak det?
Svaret er klasser.

Det kan være abstrakt, forseglet, statisk, og delvis og kan ikke være private, beskyttet og beskyttes innvendig.

Svarte 25/09/2013 kl. 10:54
kilden bruker

stemmer
-6

Det er tre grunnleggende forskjell mellom struktur og klasse

1St- minne er reservert for struktur i stabelen minne (som er nær til programmeringsspråk) enten for klasse i stabelen minne er reservert for bare reffrence og faktiske minne er reservert i haug minne.

2. - Som standard struktur behandle som en offentlig om klasse godbit som en privat.

3rd kan ikke re-bruk kode i struktur, men i klassen vi kan gjenbruke samme koden i mange tid kalt inhertence

Svarte 05/12/2014 kl. 14:45
kilden bruker

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