Erinevus struktuuri ja liidu vahel

Autor: Laura McKinney
Loomise Kuupäev: 1 Aprill 2021
Värskenduse Kuupäev: 17 Mai 2024
Anonim
ЛИЯ АХЕДЖАКОВА
Videot: ЛИЯ АХЕДЖАКОВА

Sisu


C ++ lubab kohandatud andmete loomiseks kõiki viit viisi, mida C-keel esitas. Need viis viisi on „struktuur”, „bitiväli”, „liit”, „loendus”, „typedef”. Allpool olevas artiklis uurime erinevust struktuuri ja liidu vahel. Nii struktuur kui ka liit on konteinerite andmetüübid, mis võivad hoida mis tahes „tüüpi” andmeid. Üks peamine erinevus, mis eristab struktuuri ja ühinemist, on see, et struktuuril on iga liikme jaoks eraldi mälukoht, samal ajal kui ametiühingu liikmetel on sama mälu asukoht.

Saame aru struktuuri ja liitmise erinevusest koos võrdlustabeliga.

  1. Võrdlusdiagramm
  2. Definitsioon
  3. Peamised erinevused
  4. Sarnasused
  5. Järeldus

Võrdlusdiagramm

Võrdluse alusStruktuurLiit
PõhilineEraldi mälu asukoht on määratud igale struktuuri liikmele.Kõigil ametiühingu liikmetel on sama mälu asukoht.
Deklaratsioonstruct struct_name {
tüüpi element1;
tüüpi element2;
.
.
} muutuja1, muutuja2, ...;
ametiühingu u_nimi {
tüüpi element1;
tüüpi element2;
.
.
} muutuja1, muutuja2, ...;
märksõnastructliit
SuurusStruktuuri suurus = kõigi andmeliikmete suuruse summa.Liidu suurus = suurimate liikmete suurus.
Poe väärtusSalvestab kõigile liikmetele erinevad väärtused.Kõigil liikmetel on sama väärtus.
KorragaStruktuur salvestab struktuuri mitmed väärtused, mis koosneb erinevatest osadest.Ametiühing salvestab kõigile liikmetele korraga ühe väärtuse.
Vaatamise viisAndke üks viis iga mälu asukoha kuvamiseks.Esitage mitu viisi sama mälu asukoha kuvamiseks.
Anonüümne funktsioonPuudub anonüümne funktsioon.Anonüümse liidu saab välja kuulutada.

Struktuuri määratlus

Struktuur on eri andmetüüpide muutujate kogum, mida tähistatakse üldnimega. Struktuuri muutujaid nimetatakse “liikmeteks”. Vaikimisi on kõik struktuuri liikmed avalikud. Struktuuri deklareerimisel loote malli, mida saab kasutada struktuuriobjektide loomiseks, jagades sama tüüpi andmeliikmeid ja liikmefunktsioone. Struktuuri deklareerimisele eelneb alati märksõna “struct”, mis ütleb koostajale, et struktuur on deklareeritud. Võtame näite.


Võtame näite.

struct töötaja {stringi nimi; string ettevõtte nimi; keelpillilinn; } emp1, emp2;

Siin kuulutame välja töötajate teabe salvestamise struktuuri. Deklaratsioon lõpetatakse semikooloniga, kuna struktuuri deklaratsioon on avaldus ja C ++ puhul lõpeb avaldus semikooloniga.

Struktuurile antud nimi määratleb tüübi (ülaltoodud näites on struktuuri nimi “töötaja”). Nende tüüpide muutujaid võiks luua, nagu ülalpool, lõime kaks muutujat „emp1” ja „emp2” tüübist „töötaja”. Ülaltoodud näites lõime muutuja „struktuur” vahetult pärast deklaratsiooni; vaheldumisi võiks selle luua eraldi.

struct töötaja emp1, emp2; // märksõna struct pole kohustuslik.

Struktuurmuutuja liikmeid saab lähtestada või neile juurde pääseda, kasutades punkti (.) Operaatorit.

emp1.name = "ashok";

Ühes struktuurimuutujates sisalduva teabe saab omistada teisele sama tüüpi struktuurimuutujale, mis järgneb.


emp1.name = "ashok"; emp1.company_name = "Teckpix"; emp1.city = "Delhi"; emp2 = emp1; // emp1 liikme väärtuste määramine emp2-le. cout <

Siin määrasime struktuurimuutuja 'emp1' emp2 '-ks, st' emp1 'kopeerib kogu oma liikmete väärtuse vastavale' epm2 'liikmele.

Struktuurmuutuja liige saab funktsiooni edasi anda.

funktsioon (töövõime);

Kogu struktuurimuutuja saab funktsioonile üle anda nii meetodil, mis nõuab väärtuse kui ka viite abil.

funt (emp1); // helistamisfunktsioon kõne väärtuse meetodil. . . void funct (struct töötaja emp) {// emp1 liikmete väärtuste saamine. cout <

Siin ei kajastu struktuurimuutuja liikme väärtuse muutus väljaspool funktsiooni, kuna muutuja antakse väärtuspõhise meetodi abil. Teeme nüüd sama asja helistades võrdlusmeetodi abil.

funt (& emp1); // helistamisfunktsioon kõne meetodil. . . void funct (struct töötaja * emp) {// emp1 vastuvõtmisaadress. emp-> linn = "Nur"; // muuda struktuurimuutuja emp1 liikme (linna) väärtust. . }

Siin antakse struktuurimuutujale viide, nii et struktuurimuutuja liikmete väärtuse muutus kajastub ka väljaspool funktsiooni.

srtuct töötaja * emp; // tüüpi töötaja struktuuri osuti dekaliseerimine. emp = & emp1; // emp1 aadressi määramine osutile. emp-> linn // kursor, mis avab liikme1 linn emp1.

Samuti saab luua osuti struktuurile; see hoiab struktuurimuutuja aadressi.

Struktuuris on kogu initsialiseerimine lubatud, kui struktuuri määratlus ei sisalda ühtegi kasutaja määratletud konstruktorit ega virtuaalseid funktsioone ega põhiklassi ega privaatset ega kaitstud välja.

int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Võimalik, kuna töötaja struktuur ei sisalda ühtegi ülalnimetatud asja.

Liidu määratlus

Liit on mälupesa, mida jagavad kaks või enam erinevat tüüpi muutujat, mis on deklareeritud ühe liitliigi all. Liit kuulutamiseks kasutatakse märksõna „liit“. C ++ korral võib liit sisaldada nii liikmefunktsioone kui ka muutujaid. Vaikimisi on kõik ametiühingu liikmed avalikud. „Liidu” deklaratsioon sarnaneb struktuuri deklareerimisega.

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

Siin oli meil välja kuulutatud liit nimega u_type. U_type liikmed on täisarvutüübiga „x”, tähemärgitüübiga „c” ja ujuktüübiga „f”. Samuti olime vahetult pärast liidu väljakuulutamist loonud liitmuutujad „u1” ja „u2”, „u_type” tüüpi. Samuti võime ametiühingu muutuja deklareerida eraldi liidu kuulutamisest.

int main () {liit u_tüüp u1, u2; // Märksõna liit pole C ++ -s kohustuslik. }

Liidu liikmetele pääseb juurde operaatori dot (.) Abil, millele eelneb liitmuutuja ja selle muutuja liige.

u1.x = 10;

Sarnaselt struktuuridega pole ka koondatud lähtestamine liidus võimalik. Nagu me teame, on liidul kõigi oma liikmete jaoks sama mälu asukoht korraga, ainult üks muutuja initsialiseeritakse ja kõik muutuja värskendatakse automaatselt initsialiseeritud väärtusega.

u1.x = 10; cout <

Kui proovite muuta mis tahes u1 liikme väärtust. Teist liiget värskendatakse sellele väärtusele automaatselt.

u1c = 65; cout <

Liidule eraldatud ruum on võrdne liidu suurima liikme suurusega. Kuna „char” jaoks eraldatud bait on 1 bait, on „int” 4 baiti ja „float” 4 baiti, nii et suurim suurus on 4 baiti. Niisiis, mälu, mis on eraldatud arvule „u1” ja „u2”, on 4 baiti.

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

Liidu osuti saab luua täpselt nagu ülesehitusel. Osuti hoiab liidu aadressi.

liit u_tüüp * un; un = & u1; cout <x; // 10

Sarnaselt struktuurile saab liit ka funktsioonidele üle anda nii meetodite abil, st kõne väärtuse järgi kui ka kõne alusel.

funktsioon (u1); // helistamisfunktsioon kõne väärtuse meetodil. . . void funct (union u_type un)) // // u1 liikme väärtuse saamine. cout <

Helistagem funktsioonile, kasutades helistamismeetodit.

funktsioon (& u1); // helistamisfunktsioon kõne kaudu viitemeetodil. . . void funct (union u_type un) {// saab u1 aadressi. un-> x = 20. }

C ++-s on olemas spetsiaalne liitliik, mida nimetatakse Anonüümseks Liiduks. Anonüümsel ühendusel ei saa olla tüübinime ja selle ühendi muutujat ei saa luua. Ainus on kompilaatorile öelda, et selle liikmesmuutujad peavad jagama sama asukohta. Anonüümse liitmuutuja saab viidata ilma tavalise punkti (.) Operaatorita.

int main () {union {// määratlege anonüümne liit ilma tüübinimeta. int x, char c; float f; }; x = 10; // viidatud liitmuutujale, välja arvatud punkt-operaatori vari <

Anonüümses liidus pole liikmefunktsioonid lubatud, see ei tohi sisaldada privaatseid ega kaitstud andmeid ning globaalne anonüümne liit tuleb määratleda staatiliselt.

Punktid, mida tavapärase ametiühingu deklaratsiooni puhul meeles pidada.

  • Liidu määratlus võib sisaldada ka konstruktorit ja hävitajat.
  • Liit pakub mitu võimalust sama mälu asukoha kuvamiseks.
  • Liit ei saa ühtegi tüüpi klassi pärida.
  • Ametiühing ei saa olla põhiklass.
  • Liidul ei saa olla virtuaalse liikme funktsiooni.
  • Liit ei saa olla staatilist muutujat.
  1. Struktuur kasutab erinevate liikmete jaoks erinevat mälupesa. Seega saab kõigile liikmetele eraldada selge väärtuse. Kuid liit eraldab kõigile liikmetele sama mälupesa. Seega saab kõigile liikmetele anda ühe väärtuse.
  2. Struktuuril on kõigi liikmete mälu asukoht erinev; seega võib see sisaldada mitut väärtust korraga ja kuna me teame, et liit jagab kõigi liikmete jaoks ühesugust mälupaika, saab see talletada korraga ühe väärtuse.
  3. Üldiselt on struktuuri kogusuurus suurem kui liidu kogumaht, kuna konstruktsiooni suurus on kõigi konstruktsioonide liikmete suuruste summa ja liit on suurus, mis on struktuuri liikme suurus. suurim tüüp.
  4. Struktuur pakub iga asukoha kohta ühte vaadet, samas kui liit pakub ühe asukoha mitu vaadet.
  5. Võite kuulutada anonüümseks liiduks, kuid mitte anonüümseks struktuuriks.

Sarnasused:

  • Nii struktuuril kui ka ühendusel on sama viis kuulutada ennast, luua muutujaid ja samamoodi pääseda juurde muutujate liikmetele.
  • Nii struktuuri kui ka liit saab funktsioonile üle anda nii meetodil, mille järgi hinnatakse väärtust kui ka viidet.
  • Nii struktuur kui ka liit on konteineri andmetüüp ja sisaldavad mis tahes andmetüübi objekti, sealhulgas nende liikmetena muud struktuuri, liit ja massiivi.

Järeldus:

Nii struktuur kui liit on konteineri andmetüüp, mis sisaldab erinevat tüüpi liiget. Kuid struktuure kasutatakse siis, kui peame salvestama kõigi liikmete jaoks eraldi väärtuse selgelt mälukohta. Ametiühinguid kasutatakse siis, kui on vaja tüübi teisendamist.