Erinevus struktuuri ja liidu vahel
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.
- Võrdlusdiagramm
- Definitsioon
- Peamised erinevused
- Sarnasused
- Järeldus
Võrdlusdiagramm
Võrdluse alus | Struktuur | Liit |
---|---|---|
Põhiline | Eraldi mälu asukoht on määratud igale struktuuri liikmele. | Kõigil ametiühingu liikmetel on sama mälu asukoht. |
Deklaratsioon | struct struct_name { tüüpi element1; tüüpi element2; . . } muutuja1, muutuja2, ...; | ametiühingu u_nimi { tüüpi element1; tüüpi element2; . . } muutuja1, muutuja2, ...; |
märksõna | struct | liit |
Suurus | Struktuuri suurus = kõigi andmeliikmete suuruse summa. | Liidu suurus = suurimate liikmete suurus. |
Poe väärtus | Salvestab kõigile liikmetele erinevad väärtused. | Kõigil liikmetel on sama väärtus. |
Korraga | Struktuur salvestab struktuuri mitmed väärtused, mis koosneb erinevatest osadest. | Ametiühing salvestab kõigile liikmetele korraga ühe väärtuse. |
Vaatamise viis | Andke üks viis iga mälu asukoha kuvamiseks. | Esitage mitu viisi sama mälu asukoha kuvamiseks. |
Anonüümne funktsioon | Puudub 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 < 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. 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.
Sarnasused:
Järeldus: