Razlika med strukturo in unijo

Avtor: Laura McKinney
Datum Ustvarjanja: 1 April 2021
Datum Posodobitve: 14 Maj 2024
Anonim
#Вощина литая из собственного воска: в чем разница?
Video.: #Вощина литая из собственного воска: в чем разница?

Vsebina


C ++ omogoča vseh pet načinov, na katerih je jezik C ustvaril podatke po meri. Tih pet načinov so "struktura", "bitno polje", "zveza", "naštevanje", "typedef". V spodnjem članku bomo preučili razliko med strukturo in zvezo. Tako struktura kot zveza sta podatkovni vrsti vsebnika, ki lahko vsebujeta podatke poljubne vrste. Glavna razlika, ki razlikuje strukturo in združitev, je ta, da ima struktura ločeno pomnilniško mesto za vsakega od svojih članov, medtem ko imajo člani zveze isto pomnilniško mesto.

Razumejmo razliko med strukturo in zvezo ter primerjalno tabelo.

  1. Primerjalna tabela
  2. Opredelitev
  3. Ključne razlike
  4. Podobnosti
  5. Zaključek

Primerjalna tabela

Osnova za primerjavoStrukturaZveza
OsnovniLočeno pomnilniško mesto je dodeljeno vsakemu članu strukture.Vsi člani zveze imajo isto pomnilniško mesto.
Izjavastruct struct_name {
tip element1;
tip element2;
.
.
} spremenljivka1, spremenljivka2, ...;
unije u_name {
tip element1;
tip element2;
.
.
} spremenljivka1, spremenljivka2, ...;
ključna besedaStruzveza
VelikostVelikost strukture = vsota velikosti vseh članov podatkov.Velikost unije = velikost največjih članov.
Trgovinska vrednostShrani različne vrednosti za vse člane.Hrani enako vrednost za vse člane.
Ob časuStruktura shranjuje več vrednosti različnih elementov strukture.Zveza shrani eno samo vrednost hkrati za vse člane.
Način gledanjaNavedite enojni način za ogled vsake lokacije pomnilnika.Omogočite več načinov za ogled iste lokacije v pomnilniku.
Anonimna funkcijaBrez anonimne funkcije.Lahko se prijavi anonimna zveza.

Opredelitev strukture

Struktura je zbirka spremenljivk različnih vrst podatkov, ki jih navaja skupno ime. Spremenljivke v strukturi imenujemo "člani". Vsi člani strukture so privzeto "javni". Ko prijavite strukturo, ustvarite predlogo, ki jo lahko uporabite za ustvarjanje strukturnih objektov, ki si delijo isto organizacijo podatkovnih članov in funkcij članov. Pred izjavo strukture je vedno ključna beseda „struct“, ki prevajalcu sporoči, da je bila deklarirana struktura. Vzemimo primer.


Vzemimo primer.

zaposleni v strukturi {ime niza; string company_name; mesto niza; } emp1, emp2;

Tukaj razglasimo strukturo za shranjevanje informacij zaposlenih. Deklaracija se konča s podpičjem, kot deklaracija strukture je stavek in v C ++ stavek se konča s podpičjem.

Ime, ki je bilo dano strukturi, definira "tip" (v zgornjem primeru je ime strukture "zaposleni"). Spremenljivke teh vrst bi lahko nastale, kot zgoraj, ustvarili smo dve spremenljivki 'emp1' in 'emp2' tipa "zaposleni". V zgornjem primeru smo ustvarili spremenljivko 'structure' takoj po deklaraciji; izmenično bi jo bilo mogoče ustvariti ločeno.

strukturni zaposleni emp1, emp2; // struktura ključne besede ni obvezna.

Člani strukturne spremenljivke se lahko inicializirajo ali do njih dostopajo z uporabo operatorja dot (.).

emp1.name = "ashok";

Informacije, vsebovane v eni strukturni spremenljivki, je mogoče dodeliti drugi strukturni spremenljivki iste vrste, kot sledi.


emp1.name = "ashok"; emp1.company_name = "Teckpix"; emp1.city = "Delhi"; emp2 = emp1; // dodeljevanje vrednosti člana emp1 na emp2. cout <

Tu smo dodelili spremenljivko strukture 'emp1' to 'emp2', torej 'emp1' kopira vso vrednost svojih članov v ustreznega člana 'epm2'.

Član spremenljivke strukture se lahko prenese v funkcijo.

funct (emp1.city);

Celotno spremenljivko strukture lahko prenesemo v funkcijo tako z metodami, da pokličejo po vrednosti in pokličejo po referenci.

funt (emp1); // klicna funkcija s klicem z vrednostno metodo. . . void funct (strukturo zaposlenega emp) {// sprejemanje vrednosti članov emp1. cout <

Tukaj se sprememba vrednosti člana spremenljivke strukture ne bo odražala zunaj funkcije, saj se spremenljivka prenaša s klicem z vrednostno metodo. Naredimo isto stvar s klicem po referenčni metodi.

funt (& emp1); // klicna funkcija s klicem po referenčni metodi. . . void funct (strukturni zaposleni * emp) {// sprejemni naslov emp1. emp-> city = "Nur"; // spremenite vrednost člana (mesta) strukturne spremenljivke emp1. . }

Tu se strukturna spremenljivka prenese kot referenca, zato se sprememba vrednosti članov strukturne spremenljivke odraža tudi zunaj funkcije.

srtuct zaposleni * emp; // odklanjanje kazalca strukture zaposlenega tipa. emp = & emp1; // dodeljevanju naslova emp1 kazalcu. emp-> city // kazalec, ki dostopa do mesta članice emp1.

Ustvari se lahko tudi kazalec na strukturo; ima naslov spremenljivke strukture.

V strukturi je dovoljena inicializacija agregata, kadar definicija strukture ne vsebuje nobenega uporabniško definiranega konstruktorja ali virtualnih funkcij ali osnovnega razreda ali zasebnega ali zaščitenega polja.

int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Možno, ker struktura zaposlenega ne vsebuje nobene od zgoraj omenjenih stvari.

Opredelitev unije

Zveza je pomnilniška lokacija, ki jo delita dva ali več različnih vrst spremenljivk, deklariranih pod eno vrsto zveze. Ključna beseda, ki se uporablja za razglasitev zveze, je »unije«. V C ++ lahko zveza vsebuje funkcijo člana in spremenljivke. Vsi člani zveze so privzeto "javni". Izjava o sindikatu je podobna deklaraciji strukture.

zveza u_type {int x, char c; float f; } u1, u2;

Tu smo razglasili zvezo z imenom u_type. Člani u_type so 'x' celega tipa, 'c' znakovnega tipa in 'f' float tipa. Ustvarili smo tudi spremenljivke zveze 'u1' in 'u2', vrste 'u_type', takoj po izjavi zveze. Sindikalno spremenljivko lahko razglasimo tudi ločeno od deklaracije zveze.

int main () {union u_type u1, u2; // Ključna beseda zveza v C ++ ni obvezna. }

Dostop do članov zveze se lahko izvede z uporabo operaterja dot (.), Pred katerim je spremenljivka union in sledi članu te spremenljivke.

u1.x = 10;

Tako kot strukture tudi skupna inicializacija v uniji ni mogoča. Kot vemo, ima zveza isto mesto pomnilnika za vse svoje člane hkrati inicializirana je le ena spremenljivka in vsa spremenljivka se samodejno posodobi z inicializirano vrednostjo.

u1.x = 10; cout <

Če poskusite spremeniti vrednost katerega koli člana 'u1'. Drugi član bo samodejno posodobljen na to vrednost.

u1.c = 65; cout <

Prostor, ki je bil dodeljen sindikatu, je enak velikosti največjega člana zveze. Ker je bajt, dodeljen 'char', 1 bajt, 'int' je 4 bajta in 'float' je 4 bajta, zato je največja velikost 4 bajta. Torej, pomnilnik, dodeljen 'u1' in 'u2', je 4 bajt.

int main () {int size_1 = sizeof (u1); // 4 int size_2 = sizeof (u2); // 4

Kazalnik na zvezo je mogoče ustvariti tako kot v strukturi. Kazalec vsebuje naslov zveze.

zveza u_type * un; un = & u1; cout <x; // 10

Podobno kot strukturo lahko tudi zvezo na funkcije prenesemo z obema metodama, tj. Klic po vrednosti in klic po referenci.

funkt (u1); // klicna funkcija s klicem z vrednostno metodo. . . void funct (zveza u_type un) {// sprejemanje vrednosti člana u1. cout <

Zdaj pa pokličimo funkcijo s klicem po referenčni metodi.

funct (& u1); // klicna funkcija s klicem po metodi refrence. . . void funct (zveza u_type un) {// sprejem naslova u1. un-> x = 20. }

V C ++ obstaja posebna vrsta zveze, imenovana Anonimna unija. " Anonimna zveza ne more imeti imena tipa in nobene spremenljivke takšne zveze ni mogoče ustvariti. Prevajalniku je treba povedati le, da morajo njegove spremenljivke članice deliti isto lokacijo. Spremenljivko anonimne zveze lahko pošljete brez običajnega operaterja pike (.).

int main () {union {// določi anonimno zvezo z imenom tipa. int x, char c; float f; }; x = 10; // skliceval spremenljivko unije z operaterjem dot cout <

V anonimni zvezi ni dovoljena nobena članska funkcija, ne more vsebovati zasebnih ali zaščitenih podatkov, globalna anonimna zveza pa mora biti določena kot „statična“.

Točke, ki si jih je treba zapomniti za običajno sindikalno deklaracijo.

  • Opredelitev zveze lahko vsebuje tudi konstruktor in destruktor.
  • Zveza ponuja več načinov za ogled istega pomnilniškega mesta.
  • Zveza ne more podedovati razreda katere koli vrste.
  • Zveza ne more biti osnovni razred.
  • Zveza ne more imeti funkcije virtualnega člana.
  • Zveza ne more imeti statične spremenljivke.
  1. Struktura uporablja različne pomnilniške lokacije za različne člane. Zato je mogoče določeno vrednost dodeliti vsem članom. Toda zveza vsem članom dodeli isto pomnilniško mesto. Zato je vsem članom mogoče dodeliti eno samo vrednost.
  2. Struktura ima različno pomnilniško mesto za vse člane; zato lahko hkrati vsebuje več vrednosti, in kot vemo, ima zveza isto pomnilniško mesto za vse člane, zato lahko hkrati shrani eno vrednost.
  3. Na splošno je skupna velikost strukture večja od skupne velikosti zveze, ker je velikost strukture vsota velikosti vseh članov struktur, velikost zveze pa velikost člana združenja največji tip.
  4. Struktura ponuja en sam pogled na vsako lokacijo, medtem ko zveza ponuja več pogledov ene lokacije.
  5. Lahko razglasite anonimno unijo, ne pa tudi anonimno strukturo.

Podobnosti:

  • Tako struktura kot zveza imata isti način deklariranja, ustvarjanja spremenljivk in enak način dostopa do članov spremenljivk.
  • Strukturo in zvezo lahko funkciji preneseta tako, da metode pokličejo po vrednosti in pokličejo po referenci.
  • Struktura in zveza sta podatkovni tip vsebnika in vsebujeta objekt katere koli vrste podatkov, vključno z drugo strukturo, union, matriko kot njihovi člani.

Zaključek:

Obe strukturi in združevanju sta podatkovni tip vsebnika, ki vsebuje člana različnih vrst. Toda strukture se uporabljajo, kadar moramo za vse člane shraniti ločeno vrednost na ločeno pomnilniško mesto. Sindikati se uporabljajo, kadar je potrebna pretvorba tipa.