Rozdiel medzi štruktúrou a úniou

Autor: Laura McKinney
Dátum Stvorenia: 1 Apríl 2021
Dátum Aktualizácie: 16 Smieť 2024
Anonim
Rozdiel medzi štruktúrou a úniou - Technológie
Rozdiel medzi štruktúrou a úniou - Technológie

Obsah


C ++ umožňuje všetkých päť spôsobov, ktoré poskytuje jazyk C, na vytvorenie vlastných údajov. Týchto päť spôsobov je „štruktúra“, „bitové pole“, „spojenie“, „výpočet“, „typedef“. V nasledujúcom článku sa budeme zaoberať rozdielom medzi štruktúrou a jednotou. Štruktúra a spojenie obidva sú dátové typy kontajnerov, ktoré môžu uchovávať údaje ľubovoľného „typu“. Jedným z hlavných rozdielov, ktoré rozlišujú štruktúru a spojenie, je to, že štruktúra má samostatné miesto v pamäti pre každého zo svojich členov, zatiaľ čo členovia odboru zdieľajú rovnaké miesto v pamäti.

Pochopme rozdiel medzi štruktúrou a jednotou spolu s porovnávacou tabuľkou.

  1. Porovnávacia tabuľka
  2. definícia
  3. Kľúčové rozdiely
  4. podobnosti
  5. záver

Porovnávacia tabuľka

Základ porovnaniaštruktúrazväz
základnéSamostatné miesto v pamäti je pridelené každému členu štruktúry.Všetci členovia únie zdieľajú rovnaké miesto v pamäti.
vyhláseniestruct struct_name {
typ element1;
typ element2;
.
.
} premenná1, premenná2, ...;
únie u_name {
typ element1;
typ element2;
.
.
} premenná1, premenná2, ...;
kľúčových slovstructzväz
veľkosťVeľkosť štruktúry = súčet veľkosti všetkých členov údajov.Veľkosť Únie = veľkosť najväčších členov.
Hodnota obchoduUkladá zreteľné hodnoty pre všetkých členov.Uchováva rovnakú hodnotu pre všetkých členov.
V tom časeŠtruktúra ukladá viacero hodnôt štruktúry rôznych členov.Únia ukladá naraz jednu hodnotu pre všetkých členov.
Spôsob zobrazeniaPoskytnite jediný spôsob zobrazenia každého miesta v pamäti.Poskytnite viac spôsobov zobrazenia rovnakého miesta v pamäti.
Anonymná funkciaŽiadne anonymné funkcie.Môže sa vyhlásiť anonymný zväzok.

Definícia štruktúry

Štruktúra je súbor premenných rôznych typov údajov, ktoré sa označujú spoločným názvom. Premenné v štruktúre sa nazývajú „členovia“. V predvolenom nastavení sú všetci členovia štruktúry „verejní“. Keď deklarujete štruktúru, vytvoríte šablónu, ktorá sa dá použiť na vytvorenie štruktúrnych objektov, zdieľajúcich rovnakú organizáciu dátových členov a členských funkcií. Deklarácii štruktúry vždy predchádza kľúčové slovo „struct“, ktoré hovorí kompilátoru, že štruktúra bola deklarovaná. Urobme príklad.


Urobme príklad.

štruktúrovaný zamestnanec {string name; string company_name; string mesto; } Emp1, emp2;

Tu uvádzame štruktúru na ukladanie informácií o zamestnancoch. Vyhlásenie je ukončené bodkočiarkou, pretože vyhlásenie o štruktúre je vyhlásenie a v C ++ je vyhlásenie ukončené bodkočiarkou.

Názov priradený štruktúre definuje „typ“ (v uvedenom príklade je názov štruktúry „zamestnanec“). Premenné týchto typov by sa mohli vytvoriť, ako je uvedené vyššie, vytvorili sme dve premenné „emp1“ a „emp2“ typu „zamestnanec“. V uvedenom príklade sme vytvorili premennú „štruktúra“ hneď po vyhlásení; alternatívne by sa mohol vytvoriť osobitne.

štruktúrovať zamestnanca emp1, emp2; // štruktúra kľúčového slova nie je povinná.

Členy premennej štruktúry môžu byť inicializované alebo k nim môže byť pristupované pomocou dot (.) Operátora.


emp1.name = "Ashok";

Informácie obsiahnuté v jednej štruktúrnej premennej môžu byť priradené k inej štruktúrnej premennej toho istého typu ako je uvedené ďalej.

emp1.name = "Ashok"; emp1.company_name = "Teckpix"; emp1.city = "Delhi"; emp2 = emp1; // priradenie hodnôt člena emp1 emp2. cout <

Tu sme priradili štruktúrnu premennú „emp1“ k „emp2“, takže „emp1“ skopíruje celú hodnotu svojich členov do zodpovedajúceho člena „epm2“.

Člen štruktúrnej premennej možno preniesť do funkcie.

Funct (emp1.city);

Celkovú premennú štruktúry je možné odovzdať funkcii, a to tak metódami volajúcimi podľa hodnoty, ako aj volaním odkazom.

Funt (emp1); // volanie funkcie metódou volania podľa hodnoty. , , void funct (struct empir zamestnanca) {// prijímanie hodnôt členov emp1. cout <

Tu sa zmena hodnoty člena štruktúrnej premennej neodzrkadlí mimo funkcie, pretože premenná sa odovzdáva metódou Call by Value. Teraz urobme to isté volaním referenčnou metódou.

Funt (a emp1); // volanie funkcie volaním referenčnou metódou. , , void funct (struct zamestnanec * emp) {// adresa príjemcu emp1. EMP> city = "Nur"; // zmena hodnoty člena (mesta) premennej štruktúry emp1. , }

Tu je štruktúrna premenná odovzdaná odkazom, takže zmena hodnoty členov štruktúrnej premennej sa odráža aj mimo funkcie.

odskočiť zamestnanca * emp; // deklarovanie ukazovateľa štruktúry typu zamestnanca. emp = emp1; // priradenie adresy emp1 smerníku. emp-> city // ukazovateľ prístupu do členského mesta emp1.

Ukazovateľ na štruktúru môže byť tiež vytvorený; drží adresu premennej štruktúra.

V štruktúre je inicializácia agregátu povolená, keď definícia štruktúry neobsahuje, žiadne užívateľom definované konštruktor alebo virtuálne funkcie alebo základnú triedu alebo súkromné ​​alebo chránené pole.

int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Možné, pretože štruktúra zamestnanca neobsahuje žiadne z vyššie uvedených vecí.

Vymedzenie Únie

Spojenie je pamäťové miesto zdieľané dvoma alebo viacerými rozdielnymi typmi premenných deklarovaných pod jedným typom spojenia. Kľúčové slovo použité na vyhlásenie únie je „union“. V C ++ môže odbor obsahovať tak členské funkcie, ako aj premenné. V predvolenom nastavení sú všetci členovia únie „verejní“. Vyhlásenie „únie“ je podobné vyhláseniu o štruktúre.

únie u_type {int x, char c; plavák f; } u1, u2;

Tu sme vyhlásili spojenie zvané u_type. Členovia typu u_type sú „x“ celočíselného typu, „c“ znakového typu a „f“ plávajúceho typu. Vytvorili sme tiež premenné únie „u1“ a „u2“ typu „u_type“ hneď po vyhlásení únie. Premennú odboru môžeme deklarovať aj oddelene od vyhlásenia odboru.

int main () {union u_type u1, u2; // Spojenie kľúčových slov nie je v C ++ povinné. }

Prístup členov únie sa dá dosiahnuť pomocou operátora dot (.), Ktorému predchádza premenná union a nasleduje člen tejto premennej.

u1.x = 10;

Podobne ako v prípade štruktúr, inicializácia agregátov nie je možná v odboroch. Ako vieme, zväzok zdieľa rovnaké miesto v pamäti pre všetkých svojich členov súčasne, inicializuje sa iba jedna premenná a všetky premenné sa automaticky aktualizujú o inicializovanú hodnotu.

u1.x = 10; cout <

Ak sa pokúsite zmeniť hodnotu ktoréhokoľvek člena „u1“. Druhý člen bude automaticky aktualizovaný na túto hodnotu.

u1.c = 65; cout <

Priestor pridelený únii sa rovná veľkosti najväčšieho člena únie. Keďže bajt priradený znaku „char“ je 1 bajt, „int“ je 4 bajty a „float“ sú 4 bajty, najväčšia veľkosť je 4 bajty. Pamäť pridelená „u1“ a „u2“ je teda 4 bajty.

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

Ukazovateľ na spojenie sa dá vytvoriť rovnako ako v štruktúre. Ukazovateľ drží adresu únie.

únie u_type * un; un = u1; cout <X; // 10

Rovnako ako štruktúra, spojenie môže byť tiež odovzdané do funkcií pomocou metód, t. J. Volaním podľa hodnoty a volaním odkazom.

Funct (U1); // volanie funkcie metódou volania podľa hodnoty. , , void funct (union u_type un) {// prijímanie hodnoty člena u1. cout <

Teraz povedzme túto funkciu pomocou metódy volania referenčným spôsobom.

Funct (a u1); // funkcia volania metódou chladenia. , , void funct (union u_type un) {// príjem adresy u1. un-> x = 20. }

V C ++ existuje špeciálny typ únie nazývaný Anonymná únia “. Anonymný zväzok nemôže mať názov typu a nie je možné vytvoriť takúto premennú. Je to len povedať kompilátor, že jeho členské premenné majú zdieľať rovnaké miesto. Premennú anonymného spojenia je možné uviesť bez operátora normálneho bodu (.).

int main () {union {// definuje anonymné spojenie bez názvu typu. int x, char c; plavák f; }; x = 10; // postúpil spojovaciu premennú s operátorom mimo bodku <

V anonymnom zväzku nie sú povolené žiadne členské funkcie, nemôžu obsahovať súkromné ​​ani chránené údaje a globálny anonymný zväzok musí byť špecifikovaný ako „statický“.

Body, ktoré treba pamätať na bežné vyhlásenie o odboroch.

  • Definícia únie môže obsahovať aj konštruktor a deštruktor.
  • Spojenie poskytuje niekoľko spôsobov, ako zobraziť rovnaké miesto v pamäti.
  • Únia nemôže zdediť triedu akéhokoľvek typu.
  • Únia nemôže byť základnou triedou.
  • Únia nemôže mať funkciu virtuálneho člena.
  • Únia nemôže mať statickú premennú.
  1. Štruktúra používa rôzne umiestnenie pamäte pre rôznych členov. Preto možno zreteľnú hodnotu prideliť všetkým členom. Únia však všetkým členom pridelí rovnaké miesto v pamäti. Preto môže byť členom pridelená jediná hodnota.
  2. Štruktúra má odlišné umiestnenie pamäte pre všetkých členov; preto môže obsahovať viac hodnôt naraz a ako vieme, že odbor zdieľa rovnaké miesto v pamäti pre všetkých členov, môže ukladať naraz iba jednu hodnotu.
  3. Všeobecne je celková veľkosť štruktúry väčšia ako celková veľkosť spojenia, pretože veľkosť štruktúry je súčtom veľkosti všetkých členov štruktúr a veľkosť spojenia je veľkosť člena člena najväčší typ.
  4. Štruktúra poskytuje jeden pohľad na každé miesto, zatiaľ čo spojenie poskytuje viac pohľadov na jedno miesto.
  5. Môžete vyhlásiť anonymný zväzok, ale nie anonymnú štruktúru.

podobnosti:

  • Štruktúra aj spojenie majú rovnaký spôsob deklarovania samého seba, vytvárania premenných a rovnakého prístupu k členom premenných.
  • Štruktúra aj spojenie môžu byť odovzdané funkcii metódami call by value a call reference.
  • Štruktúra aj spojenie sú typom kontajnera a obsahujú ako objekt svojich členov akýkoľvek typ údajov vrátane inej štruktúry, spojenia alebo poľa.

záver:

Štruktúra aj spojenie sú dátový typ kontajnera, ktorý obsahuje člena rôznych typov. Štruktúry sa však používajú, keď potrebujeme uložiť zreteľnú hodnotu pre všetkých členov na odlišnom pamäťovom mieste. Odbory sa používajú, keď je potrebná konverzia typu.