Skirtumas tarp struktūros ir sąjungos

Autorius: Laura McKinney
Kūrybos Data: 1 Balandis 2021
Atnaujinimo Data: 14 Gegužė 2024
Anonim
69 - DIFFERENCE BETWEEN STRUCTURE & UNION - C PROGRAMMING
Video.: 69 - DIFFERENCE BETWEEN STRUCTURE & UNION - C PROGRAMMING

Turinys


„C ++“ leidžia visais penkiais būdais, kuriuos pateikė C kalba, sukurti pasirinktinius duomenis. Tie penki būdai yra „struktūra“, „bitų laukas“, „sąjunga“, „surašymas“, „typedef“. Žemiau esančiame straipsnyje išnagrinėsime skirtumą tarp struktūros ir sąjungos. Struktūra ir sąjunga yra konteinerių duomenų tipai, kurie gali laikyti bet kokio „tipo“ duomenis. Pagrindinis skirtumas, išskiriantis struktūrą ir sąjungą, yra tas, kad struktūra turi atskirą atminties vietą kiekvienam savo nariui, tuo tarpu sąjungos nariai turi tą pačią atminties vietą.

Supraskime struktūros ir sąjungos skirtumus kartu su palyginimo diagrama.

  1. Palyginimo diagrama
  2. Apibrėžimas
  3. Pagrindiniai skirtumai
  4. Panašumai
  5. Išvada

Palyginimo diagrama

Palyginimo pagrindasStruktūraSąjunga
PagrindinisAtskira atminties vieta yra paskirta kiekvienam struktūros nariui.Visi sąjungos nariai turi tą pačią atminties vietą.
Deklaracijastruct struct_name {
tipo elementas1;
tipo elementas2;
.
.
} kintamasis1, kintamasis2, ...;
sąjunga u_name {
tipo elementas1;
tipo elementas2;
.
.
} kintamasis1, kintamasis2, ...;
raktinis žodisstruktsąjunga
DydisStruktūros dydis = visų duomenų narių dydžio suma.Sąjungos dydis = didžiausių narių dydis.
Parduotuvės vertėSaugo skirtingas vertybes visiems nariams.Sandoriai vienoda visiems nariams.
Tuo metuStruktūroje saugomos kelios skirtingų struktūros elementų vertės.Profesinė sąjunga kaupia vieną vertę vienu metu visiems nariams.
Žiūrėjimo būdasPateikite vieną būdą, kaip peržiūrėti kiekvieną atminties vietą.Pateikite kelis būdus, kaip peržiūrėti tą pačią atminties vietą.
Anonimas bruožasNėra anoniminių funkcijų.Galima paskelbti anoniminę sąjungą.

Struktūros apibrėžimas

Struktūra - tai įvairių duomenų tipų kintamųjų rinkinys, žymimas bendruoju pavadinimu. Kintamieji struktūroje yra vadinami „nariais“. Pagal numatytuosius nustatymus visi struktūros nariai yra „vieši“. Deklaruodami struktūrą, sukuriate šabloną, kuris gali būti naudojamas struktūros objektams kurti, dalijantis ta pačia duomenų narių organizacija ir nario funkcijomis. Prieš deklaruojant struktūrą, prieš žodį „struct“ sakoma kompiliatoriui, kad struktūra yra deklaruota. Paimkime pavyzdį.


Paimkime pavyzdį.

struct darbuotojas {stygos vardas; stygos įmonės_pavadinimas; stygų miestas; } emp1, emp2;

Čia mes deklaruojame darbuotojų informacijos saugojimo struktūrą. Deklaracija nutraukiama kabliataškiu, nes struktūros deklaracija yra teiginys, o C ++ klase - teiginys nutraukiamas kabliataškiu.

Pavadinimas, suteiktas struktūrai, apibūdina „tipą“ (aukščiau pateiktame pavyzdyje struktūros pavadinimas yra „darbuotojas“). Šių tipų kintamieji gali būti sukurti, kaip aprašyta aukščiau, mes sukūrėme du „darbuotojo“ tipo kintamuosius „emp1“ ir „emp2“. Aukščiau pateiktame pavyzdyje sukūrėme „struktūros“ kintamąjį iškart po deklaracijos; pakaitomis jis gali būti sukurtas atskirai.

struct darbuotojas emp1, emp2; // raktinis žodis struct nėra privalomas.

Struktūrinio kintamojo narius galima inicijuoti arba prie jų prisijungti naudojant tašką (.).

emp1.name = "ashok";

Viename struktūros kintamajame esančią informaciją galima priskirti kitam tos pačios rūšies struktūros kintamajam, kaip nurodyta toliau.


emp1.name = "ashok"; emp1.company_name = "Teckpix"; emp1.city = „Delis“; emp2 = emp1; // emp1 nario reikšmių priskyrimas emp2. cout <

Čia struktūros kintamąjį „emp1“ priskyrėme „emp2“, taigi „emp1“ nukopijuoja visas savo narių reikšmes į atitinkamą „epm2“ narį.

Struktūros kintamojo narys gali būti perduotas funkcijai.

funktas (darbingumas);

Visas struktūros kintamasis gali būti perduotas funkcijai tiek metodais, vadinamais pagal vertę, tiek skambinant pagal nuorodą.

funtas (emp1); // skambučio funkcija pagal skambučio pagal vertės metodą. . . void funct (struct töötaja emp) {// emp1 narių gaunamų verčių. cout <

Čia struktūros kintamojo nario vertės pokytis neatsispindės už funkcijos ribų, nes kintamasis perduodamas skambučio pagal vertę metodu. Dabar darykime tą patį, naudodamiesi skambučiu, naudodami pamatinį metodą.

funtas (& emp1); // skambučio funkcija skambinant referenciniu metodu. . . void funct (struct darbuotojas * emp) {// emp1 adresas gaunamas. emp-> miestas = „Nur“; // pakeisti struktūros kintamojo emp1 nario (miesto) vertę. . }

Čia struktūros kintamasis perduodamas kaip nuoroda, taigi struktūros kintamojo narių vertės pokytis taip pat atsispindi ir funkcijos išorėje.

srtuct darbuotojas * emp; // tipo darbuotojo struktūros rodyklės žymėjimas. emp = & emp1; // emp1 adreso priskyrimas žymekliui. emp-> city // rodyklė, pasiekianti emp1 miestą.

Taip pat galima sukurti žymiklį prie struktūros; jis turi struktūros kintamojo adresą.

Struktūroje jungtinę inicializaciją leidžiama naudoti tada, kai struktūros apibrėžime nėra jokio vartotojo apibrėžto konstruktoriaus ar virtualių funkcijų, bazinės klasės ar privataus ar apsaugoto lauko.

int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Galima, nes darbuotojo struktūroje nėra aukščiau paminėtų dalykų.

Sąjungos apibrėžimas

Sąjunga yra atminties vieta, kuria dalijasi du ar daugiau skirtingų tipų kintamųjų, deklaruojamų pagal vieną sąjungos tipą. Raktinis žodis, naudojamas deklaruojant sąjungą, yra „sąjunga“. C ++ sąjungoje gali būti ir nario funkcijos, ir kintamieji. Pagal nutylėjimą visi sąjungos nariai yra „vieši“. „Sąjungos“ deklaracija yra panaši į struktūros deklaraciją.

unija u_type {int x, char c; plūdės f; } u1, u2;

Čia mes paskelbėme sąjungą, pavadintą u_type. „U_type“ nariai yra sveikojo skaičiaus „x“, simbolio tipo „c“ ir plūduriuojančio tipo „f“. Taip pat sukūrėme sąjungos kintamuosius „u1“ ir „u2“, „u_type“ tipo, iškart po sąjungos paskelbimo. Mes taip pat galime deklaruoti sąjungos kintamąjį atskirai nuo sąjungos deklaracijos.

int main () {sąjungos u_tipas u1, u2; // Raktinių žodžių sąjunga nėra privaloma C ++. }

Prieiga prie sąjungos narių gali būti naudojama naudojant tašką (.) Operatorių, prieš kurį eina sąjungos kintamasis ir seka to kintamojo narį.

u1.x = 10;

Kaip ir struktūros, jungtinė inicializacija neįmanoma. Kaip mes žinome, sąjunga turi tą pačią visų savo narių atminties vietą vienu metu, tik vienas kintamasis yra inicializuojamas ir visi kintamieji automatiškai atnaujinami su inicializuota reikšme.

u1.x = 10; cout <

Jei bandysite pakeisti bet kurio „u1“ nario vertę. Kitas narys bus automatiškai atnaujintas iki tos vertės.

u1.c = 65; cout <

Sąjungai skirta erdvė yra lygi didžiausio sąjungos nario dydžiui. Kadangi „char“ paskirtas baitas yra 1 baitas, „int“ yra 4 baitai, o „slankioji“ yra 4 baitai, todėl didžiausias dydis yra 4 baitai. Taigi „u1“ ir „u2“ paskirta atmintis yra 4 baitai.

int main () {int dydis_1 = dydis (u1); // 4 int dydis_2 = dydis (u2); // 4

Rodyklė į sąjungą gali būti sukurta kaip ir struktūra. Rodyklė nurodo sąjungos adresą.

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

Kaip ir struktūra, sąjunga taip pat gali būti perduodama funkcijoms tiek metodais, t. Y. Skambinti pagal vertę, tiek skambinti pagal nuorodą.

funktas (u1); // skambučio funkcija pagal skambučio pagal vertės metodą. . . void funct (unija u_type un) {// gaunant u1 nario reikšmę. cout <

Dabar paskambinkime funkcijai, naudodamiesi skambučio pagal referencinį metodą.

funktas (& u1); // skambučio funkcija skambinant refrence metodu. . . void funct (sąjunga u_type un) {// gavus u1 adresą. un-> x = 20. }

C ++ sistemoje yra specialus sąjungos tipas, vadinamas Anonimų sąjunga “. Anoniminė sąjunga negali turėti tipo pavadinimo, todėl negali būti sukurtas joks kintamasis. Tik reikia pasakyti kompiliatoriui, kad jo narių kintamieji turi naudoti tą pačią vietą. Anoniminės sąjungos kintamąjį galima nurodyti be įprasto taško (.) Operatoriaus.

int main () {union {// apibrėžti anoniminę sąjungą, nurodant tipo pavadinimą. int x, char c; plūdės f; }; x = 10; // nurodytas sąjungos kintamasis, nurodant taškinį operatoriaus ženklą <

Anoniminėje sąjungoje neleidžiama jokia nario funkcija, joje negali būti privačių ar saugomų duomenų, o pasaulinė anoniminė sąjunga turi būti nurodyta kaip „statiška“.

Taškai, kuriuos reikia atsiminti įprastos sąjungos deklaracijos atveju.

  • Sąjungos sąvoką taip pat gali sudaryti konstruktorius ir griovėjas.
  • Sąjungoje pateikiami keli tos pačios atminties vietos peržiūros būdai.
  • Unija negali paveldėti jokios rūšies klasės.
  • Sąjunga negali būti pagrindinė klasė.
  • Sąjunga negali atlikti virtualiojo nario funkcijos.
  • Sąjunga negali turėti statinio kintamojo.
  1. Struktūra naudoja skirtingą atminties vietą skirtingiems nariams. Taigi visiems nariams gali būti suteikta atskira vertė. Tačiau sąjunga visiems nariams skiria tą pačią atminties vietą. Taigi visiems nariams gali būti paskirta viena vertė.
  2. Struktūra turi skirtingą visų narių atminties vietą; taigi, joje gali būti kelios vertės vienu metu, ir kadangi mes žinome, kad sąjunga turi tą pačią atmintį visiems nariams, ji gali saugoti vieną vertę vienu metu.
  3. Paprastai bendras konstrukcijos dydis yra didesnis už bendrą sąjungos dydį, nes struktūros dydis yra visų konstrukcijų narių dydžio suma, o jungties dydis yra visos struktūros nario dydis. didžiausias tipas.
  4. Struktūra suteikia vieną vaizdą iš kiekvienos vietos, o sąjunga pateikia kelis vienos vietos vaizdus.
  5. Galite deklaruoti anoniminę sąjungą, bet ne anoniminę struktūrą.

Panašumai:

  • Tiek struktūra, tiek sąjunga vienodai deklaruoja save, sukuria kintamuosius ir tą patį būdą prieiti prie kintamųjų narių.
  • Tiek struktūra, tiek sąjunga gali būti perduota funkcijai tiek metodais, kurie vadinami verte, tiek skambučiais pagal referenciją.
  • Struktūra ir sąjunga yra konteinerio duomenų tipas ir apima bet kokio tipo duomenų objektą, įskaitant jų struktūrą, sąjungą, masyvą.

Išvada:

Tiek struktūra, tiek sąjunga yra konteinerio duomenų tipas, kuriame yra skirtingų tipų nariai. Bet struktūros yra naudojamos, kai turime saugoti atskirą visų narių vertę tam tikroje atminties vietoje. Unijos naudojamos, kai reikia tipo konvertavimo.