Ero rakenteen ja unionin välillä

Kirjoittaja: Laura McKinney
Luomispäivä: 1 Huhtikuu 2021
Päivityspäivä: 13 Saattaa 2024
Anonim
Ero rakenteen ja unionin välillä - Tekniikka
Ero rakenteen ja unionin välillä - Tekniikka

Sisältö


C ++ sallii kaikki viisi C-kielen tarjoamaa tapaa luoda mukautettuja tietoja. Nämä viisi tapaa ovat 'rakenne', 'bittikenttä', 'unioni', 'enumeration', 'typedef'. Seuraavassa artikkelissa aiomme tutkia eroa rakenteen ja liiton välillä. Rakenne ja unioni ovat molemmat säilötietotyyppejä, joihin mahtuu minkä tahansa tyyppisiä tietoja. Yksi merkittävä ero, joka erottaa rakenteen ja liiton, on, että rakenteella on erillinen muistipaikka jokaiselle jäsenelleen, kun taas liiton jäsenillä on sama muistipaikka.

Ymmärretään ero rakenteen ja liiton välillä sekä vertailutaulukko.

  1. Vertailutaulukko
  2. Määritelmä
  3. Keskeiset erot
  4. yhtäläisyyksiä
  5. johtopäätös

Vertailutaulukko

Vertailun perusteetRakenneliitto
perustiedotErillinen muistipaikka on varattu jokaiselle rakenteen jäsenelle.Kaikilla unionin jäsenillä on sama muistipaikka.
ilmoitusstruct struct_name {
tyyppi elementti1;
tyyppi elementti2;
.
.
} muuttuja1, muuttuja2, ...;
liitto u_name {
tyyppi elementti1;
tyyppi elementti2;
.
.
} muuttuja1, muuttuja2, ...;
avainsanastructliitto
KokoRakenteen koko = kaikkien datajäsenten koon summa.Unionin koko = suurimpien jäsenten koko.
Kaupan arvoTallentaa erilliset arvot kaikille jäsenille.Tallentaa saman arvon kaikille jäsenille.
KerrallaanRakenne tallentaa rakenteen useita arvoja, eri jäseniltä.Liitto tallentaa yhden arvon kerrallaan kaikille jäsenille.
KatselutapaTarjoa yksi tapa nähdä jokainen muistipaikka.Tarjoa useita tapoja nähdä saman muistin sijainti.
Anonyymi ominaisuusEi nimettömää ominaisuutta.Anonyymi liitto voidaan julistaa.

Määritelmä rakenne

Rakenne on kokoelma eri tietotyyppien muuttujia, joihin viitataan yleisellä nimellä. Rakenteen muuttujia kutsutaan ”jäseniksi”. Oletuksena kaikki rakenteen jäsenet ovat ”julkisia”. Kun ilmoitat rakenteen, luot mallin, jota voidaan käyttää rakenneobjektien luomiseen jakamalla sama datajäsenten ja jäsentoimintojen organisaatio. Rakenteen ilmoitusta edeltää aina avainsana “struct”, joka kertoo kääntäjälle, että rakenne on ilmoitettu. Otetaan esimerkki.


Otetaan esimerkki.

struct työntekijä {merkkijono nimi; merkkijono yrityksen_nimi; merkkijono kaupunki; } Emp1, emp2;

Tässä ilmoitamme rakenteen työntekijöiden tietojen tallentamiseksi. Ilmoitus päättyy puolipisteellä, koska rakenneilmoitus on käsky ja C ++: ssa lause päättyy puolipisteellä.

Rakenteelle annettu nimi määrittelee ”tyypin” (yllä olevassa esimerkissä rakenteen nimi on ”työntekijä”). Näiden tyyppiset muuttujat voitiin luoda, kuten yllä, loimme kaksi muuttujaa 'emp1' ja 'emp2' tyypistä 'työntekijä'. Yllä olevassa esimerkissä loimme 'rakenteen' muuttujan heti ilmoituksen jälkeen; vuorotellen, se voitaisiin luoda erikseen.

struct työntekijä emp1, emp2; // avainsanan rakenne ei ole pakollinen.

Rakennemuuttujan jäsenet voidaan alustaa tai päästä niihin käyttämällä piste (.) -Operaattoria.


emp1.name = "ashok";

Yhdessä rakennemuuttujassa olevat tiedot voidaan osoittaa seuraavalle saman tyyppiselle rakennemuuttujalle.

emp1.name = "ashok"; emp1.company_name = "Teckpix"; emp1.city = "Delhi"; emp2 = emp1; // emp1: n jäsenen arvojen osoittaminen emp2: lle. cout <

Tässä määrittelimme rakennemuuttujan 'emp1' 'emp2': ksi, 'emp1' kopioi kaikki jäsenten arvot vastaavalle 'epm2' jäsenelle.

Rakennemuuttujan jäsen voidaan siirtää funktioon.

funct (emp1.city);

Koko rakennemuuttuja voidaan siirtää toimintoon, sekä menetelmillä, jotka vaativat arvoa että kutsu viittauksin.

Funt (emp1); // kutsutoiminto puhelun perusteella -menetelmällä. . . void funct (struct työntekijä emp) {// emp1: n jäsenten arvojen saaminen. cout <

Tässä muutos rakennemuuttujan jäsenen arvoon ei heijastu funktion ulkopuolella, koska muuttuja välitetään puhelun avulla -menetelmällä. Tehdään nyt sama asia soittamalla vertailumenetelmällä.

Funt (& emp1); // kutsutoiminto kutsumalla referenssimenetelmällä. . . void funct (struct työntekijä * emp) {// emp1: n vastaanottoosoite. EMP> city = "Nur"; // muuttaa rakennemuuttajan emp1 jäsenen (kaupungin) arvoa. . }

Tässä rakennemuuttuja ohitetaan viittauksella, joten muutos rakennemuuttujan jäsenten arvoon heijastaa myös funktion ulkopuolella.

srtuct työntekijä * emp; // tyypin työntekijän rakenneosoittimen purkaminen. EMP = & emp1; // emp1-osoitteen osoittaminen osoittimelle. emp-> kaupunki // osoitin, joka käyttää jäsenkaupunkia emp1.

Rakenteen osoitin voidaan myös luoda; siinä on rakennemuuttujan osoite.

Rakenteessa aggregoitu alustaminen on sallittua, kun rakenteen määritelmä ei sisällä käyttäjän määrittelemää rakentajaa tai virtuaalitoimintoja tai perusluokkaa tai yksityistä tai suojattua kenttää.

int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Mahdollinen työntekijän rakenteessa ei sisällä mitään edellä mainittuja asioita.

Unionin määritelmä

Liitto on muistipaikka, joka jaetaan kahdelle tai useammalle erityyppiselle muuttujalle, jotka on ilmoitettu yhdeksi liitostyypiksi. Unionin julistamiseen käytetty avainsana on ”unioni”. C ++: ssa unioni voi sisältää sekä jäsenfunktiota että muuttujia. Oletusarvon mukaan kaikki liiton jäsenet ovat ”julkisia”. Unionin julistus on samanlainen kuin rakenteen julistus.

unioni u_type {int x, char c; kellua f; } u1, u2;

Täällä olimme julistaneet liiton nimeltä u_type. U_type-jäsenet ovat kokonaislukua 'x', merkkityyppiä 'c' ja kelluvatyyppiä 'f'. Olimme myös luoneet liittomuuttujat 'u1' ja 'u2', tyyppiä 'u_type', heti liiton ilmoituksen jälkeen. Voimme myös julistaa liittomuuttujan erikseen liiton ilmoituksesta.

int main () {unioni u_tyyppi u1, u2; // Avainsanan liitto ei ole pakollinen C ++: ssa. }

Unionin jäsenten pääsy voidaan tehdä käyttämällä piste (.) -Operaattoria, jota edeltää unionimuuttuja ja seuraa kyseisen muuttujan jäsentä.

u1.x = 10;

Kuten rakenteet, aggregoitu alustaminen ei ole mahdollista liitossa. Kuten tiedämme, unionilla on sama muistipaikka kaikille jäsenilleen kerrallaan, vain yksi muuttuja alustetaan ja kaikki muuttujat päivitetään automaattisesti alustetulla arvolla.

u1.x = 10; cout <

Jos yrität muuttaa minkä tahansa 'u1': n jäsenen arvoa. Toinen jäsen päivitetään automaattisesti arvoon.

u1.c = 65; cout <

Liitolle varattu tila on yhtä suuri kuin unionin suurin jäsen. Koska 'char'lle varattu tavu on 1 tavu,' int 'on 4 tavua ja' float 'on 4 tavua, joten suurin koko on 4 tavua. Joten 'u1' ja 'u2' -muisti on 4 tavua.

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

Osoitin liitolle voidaan luoda aivan kuten rakenteessa. Osoittimella on unionin osoite.

unioni u_type * un; un = & U1; cout <x; // 10

Kuten rakenne, unioni voidaan siirtää toimintoihin myös molemmilla menetelmillä, ts. Arvon mukaan ja kutsun perusteella.

funct (u1); // kutsutoiminto puhelun perusteella -menetelmällä. . . void funct (union u_type un) {// vastaanottaa u1: n jäsenen arvon. cout <

Soitetaan nyt toiminnolle puhelun avulla referenssimenetelmällä.

funct (& U1); // kutsutoiminto puhelun kautta viitemenetelmällä. . . void funct (union u_type un) {// vastaanottaa u1: n osoitteen. un-> x = 20. }

C ++: ssa on erityinen liitto, jota kutsutaan nimettömäksi unioniksi. Nimettömällä liitolla ei voi olla tyyppinimeä, eikä tällaisen liitoksen muuttujaa voida luoda. Ainoa on kertoa kääntäjälle, että sen jäsenmuuttujilla on oltava sama sijainti. Anonyymin liitoksen muuttuja voidaan viitata ilman normaalia piste (.) -Operaattoria.

int main () {union {// määrittele nimetön liitto ilman tyypin nimeä. int x, char c; kellua f; }; x = 10; // viittasi liitosmuuttujaan pisteoperaattorin kanssa <

Nimettömässä liitossa jäsentoiminnot eivät ole sallittuja, se ei voi sisältää yksityisiä tai suojattuja tietoja, ja globaali tuntematon liitto on määritettävä 'staattiseksi'.

Muistettavat seikat tavanomaisen unionin julistuksen yhteydessä.

  • Unionin määritelmässä voi olla myös rakentaja ja tuhoaja.
  • Liitto tarjoaa useita tapoja nähdä saman muistin sijainti.
  • Liitto ei voi periä minkään tyyppistä luokkaa.
  • Liitto ei voi olla perusluokka.
  • Liitolla ei voi olla virtuaalista jäsentoimintoa.
  • Liitolla ei voi olla staattista muuttujaa.
  1. Rakenne käyttää eri muistipaikkaa eri jäsenille. Näin ollen erillinen arvo voidaan jakaa kaikille jäsenille. Mutta liitto varaa saman muistipaikan kaikille jäsenille. Siksi kaikille jäsenille voidaan jakaa yksi arvo.
  2. Rakenteella on erilainen muistin sijainti kaikille jäsenille; joten se voi sisältää useita arvoja kerrallaan, ja koska tiedämme, että unionilla on sama muistipaikka kaikille jäsenille, se voi siis tallentaa yhden arvon kerrallaan.
  3. Yleensä rakenteen kokonaiskoko on suurempi kuin liitoksen kokonaiskoko, koska rakenteen koko on rakenteiden kaikkien jäsenten koon summa ja liiton koko on rakenteen jäsenen koko. suurin tyyppi.
  4. Rakenne tarjoaa yhden näkymän jokaisesta sijainnista, kun taas liitto tarjoaa useita näkymiä yhdestä sijainnista.
  5. Voit julistaa nimettömän liiton, mutta et nimettömänä rakenteena.

yhtäläisyyksiä:

  • Sekä rakenteella että liitolla on sama tapa julistaa itsensä, luoda muuttujia ja samalla tavalla päästä muuttujien jäseniin.
  • Sekä rakenne että liitos voidaan siirtää funktioon molemmilla menetelmillä, jotka vaativat arvoa ja kutsu viittauksin.
  • Sekä rakenne että liitos ovat säilötietotyyppejä ja sisältävät minkä tahansa tietotyypin objektin, mukaan lukien muut jäsenet, rakenne, liitto ja taulukko.

johtopäätös:

Sekä rakenne että liitos ovat konttitiedot, jotka sisältävät erityyppisiä jäseniä. Mutta rakenteita käytetään, kun meidän on tallennettava erillinen arvo kaikille jäsenille erilliseen muistipaikkaan. Liitoksia käytetään, kun tyypin muuntamista tarvitaan.