Diferența dintre structură și uniune

Autor: Laura McKinney
Data Creației: 1 Aprilie 2021
Data Actualizării: 17 Mai 2024
Anonim
România în Direct: Negocierile de pace dintre Ucraina și Rusia eșuează. Este și războiul nostru?
Video: România în Direct: Negocierile de pace dintre Ucraina și Rusia eșuează. Este și războiul nostru?

Conţinut


C ++ permite toate cele cinci moduri pe care le-a furnizat limbajul C pentru a crea date personalizate. Aceste cinci moduri sunt „structură”, „câmp de biți”, „uniune”, „enumerare”, „tipedef”. În articolul de mai jos, vom studia diferența dintre structură și uniune. Structura și unirea sunt ambele tipuri de date de container care pot conține date de orice tip. O singură diferență majoră care distinge structura și uniunea este că structura are o locație de memorie separată pentru fiecare dintre membrii săi, în timp ce, membrii unei uniuni au aceeași locație de memorie.

Să înțelegem diferența dintre structură și uniune, împreună cu un grafic de comparație.

  1. Diagramă de comparație
  2. Definiție
  3. Diferențele cheie
  4. Asemănările
  5. Concluzie

Diagramă de comparație

Bazele comparațieiStructuraUniune
De bazăLocația separată de memorie este atribuită fiecărui membru al structurii.Toți membrii uniunii au aceeași locație de memorie.
Declaraţiestruct struct_name {
elementul tip1;
elementul tip2;
.
.
} variabilă1, variabilă2, ...;
union u_name {
elementul tip1;
elementul tip2;
.
.
} variabilă1, variabilă2, ...;
cuvinte cheiestructuniune
mărimeaDimensiunea structurii = suma dimensiunii tuturor membrilor de date.Dimensiunea Uniunii = dimensiunea celor mai mari membri.
Valoarea magazinuluiStochează valori distincte pentru toți membrii.Stochează aceeași valoare pentru toți membrii.
La un moment datO structură stochează mai multe valori, ale diferiților membri, ai structurii.Uniunea stochează o valoare unică la un moment dat pentru toți membrii.
Mod de vizualizareOferiți un singur mod de a vizualiza fiecare locație de memorie.Oferiți mai multe modalități de a vizualiza aceeași locație de memorie.
Funcție anonimăFără caracteristică anonimă.Uniunea anonimă poate fi declarată.

Definiția Structure

Structura este o colecție de variabile de diferite tipuri de date, la care se face referire cu un nume comun. Variabilele dintr-o structură se numesc „membri”. În mod implicit, toți membrii unei structuri sunt „publici”. Când declarați o structură, creați un șablon, care poate fi utilizat pentru a crea obiecte de structură, partajând aceeași organizare de membri de date și funcții de membru. Declarația structurii este întotdeauna precedată de cuvântul cheie „struct”, care spune compilatorului că o structură a fost declarată. Să luăm un exemplu.


Să luăm un exemplu.

struct angajat {string nume; string nume_ companie; oraș de sfoară; } Emp1, emp2;

Aici, declarăm o structură pentru stocarea informațiilor angajaților. Declarația este încheiată cu un punct și virgulă, deoarece declarația de structură este o declarație și, în C ++, declarația este încheiată cu un punct și virgulă.

Numele dat unei structuri definește un „tip” (în exemplul de mai sus numele structurii este „angajat”). Variabilele de aceste tipuri ar putea fi create, ca mai sus, am creat două variabile „emp1” și „emp2” de tip „angajat”. În exemplul de mai sus, am creat o variabilă „structură” imediat după declarație; alternativ, ar putea fi creat separat.

struct angajat emp1, emp2; // structul de cuvinte cheie nu este obligatoriu.

Membrii unei variabile de structură pot fi inițializați sau pot fi accesați utilizând operatorul punct (.).

emp1.name = "ashok";

Informațiile conținute într-o variabilă de structură pot fi atribuite unei alte variabile de structură de același tip ca cele următoare.


emp1.name = "ashok"; emp1.company_name = "Teckpix"; emp1.city = "Delhi"; emp2 = emp1; // alocarea valorilor membrului emp1 la emp2. cout <

Aici, am atribuit variabila de structură „emp1” la „emp2”, astfel, „emp1” copiază toată valoarea membrilor săi membrului corespunzător al „epm2”.

Membrul variabilei de structură poate fi trecut la funcție.

funct (emp1.city);

Întreaga variabilă de structură poate fi trecută la funcție, atât prin metodele apel după valoare, cât și prin apel prin referință.

Funt (emp1); // funcția de apelare prin metoda apelului după valoare. . . void funct (struct emp emp) {// primirea valorilor membrilor emp1. cout <

Aici, modificarea valorii unui membru al variabilei de structură nu se va reflecta în afara funcției, deoarece o variabilă este trecută prin metoda apelului prin valoare. Acum să facem același lucru prin apel prin metoda de referință.

Funt (& emp1); // funcția de apelare prin apel prin metoda de referință. . . funcția void (struct angajat * emp) {// adresa de primire a emp1. vorba sunt> city = "Nur"; // schimbați valoarea membrului (orașului) variabilei de structură emp1. . }

Aici, variabila de structură este trecută prin referință, astfel încât modificarea la valoarea membrilor variabilei de structură se reflectă și în afara funcției.

srtuct angajat * emp; // decalarea indicelui de structură al tipului de angajat. emp = & emp1; // atribuirea adresei emp1 la pointer. emp-> city // pointer care accesează orașul membru emp1.

Pointerul către structură poate fi, de asemenea, creat; deține adresa variabilei de structură.

În structură, inițializarea agregatului este permisă atunci când definiția structurii nu conține, orice constructor sau funcții virtuale definite de utilizator sau clasă de bază sau câmp privat sau protejat.

int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Posibil ca structura angajatului să nu conțină niciun lucru menționat mai sus.

Definiția Union

O uniune este o locație de memorie împărtășită de două sau mai multe tipuri de variabile diferite declarate sub un singur tip de uniune. Cuvântul cheie folosit pentru a declara o uniune este „uniune”. În C ++, o uniune poate conține atât funcția de membru, cât și variabilele. În mod implicit, toți membrii sindicatului sunt „publici”. Declarația de „unire” este similară cu cea a structurii.

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

Aici, declarasem o uniune numită u_type. Membrii tipului u_type sunt „x” de tip întreg, „c” de tip caractere și „f” de tip float. Am creat, de asemenea, variabilele de uniune „u1” și „u2”, de tip „u_type”, imediat după declararea unei uniuni. Putem declara, de asemenea, variabila unirii separat de declararea unei uniuni.

int main () {union u_type u1, u2; // Uniunea de cuvinte cheie nu este obligatorie în C ++. }

Accesarea membrilor uniunii se poate face folosind operatorul punct (.), Precedat de uniunea variabilă și urmat de membrul acelei variabile.

u1.x = 10;

La fel ca structurile, inițializarea agregatului nu este posibilă într-o uniune. După cum știm, uniunea împărtășește aceeași locație de memorie pentru toți membrii ei la un moment dat, doar o singură variabilă este inițiată și toată variabila este actualizată automat cu valoarea inițiată.

u1.x = 10; cout <

Dacă încercați să modificați valoarea oricărui membru din „u1”. Celălalt membru va fi actualizat automat la această valoare.

u1.c = 65; cout <

Spațiul alocat uniunii este egal cu dimensiunea celui mai mare membru al uniunii. Deoarece octețul alocat „char” este de 1 octet, „int” este de 4 octeți și „float” este de 4 octeți, deci cea mai mare dimensiune este de 4 octeți. Deci, memoria alocată „u1” și „u2” este de 4 octeți.

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

Indicatorul pentru unire poate fi creat la fel ca în structură. Indicatorul ține adresa unirii.

union u_type * un; un = & u1; cout <X; // 10

Ca și structură, unirea poate fi trecută și la funcții prin ambele metode, adică apel după valoare și apelare prin referință.

funct (u1); // funcția de apelare prin metoda apelului după valoare. . . void function (union u_type un) {// primirea valorii membrului din u1. cout <

Acum, să apelăm funcția folosind apelul prin metoda de referință.

funct (& u1); // funcția de apelare prin apel prin metoda de referință. . . void function (union u_type un) {// primirea adresei u1. un-> x = 20. }

În C ++ există un tip special de uniune numit Uniunea anonimă ”. Uniunea anonimă nu poate avea numele tipului și nu poate fi creată nicio variabilă a acestei uniuni. Este de spus numai compilatorului că variabilele sale membre trebuie să partajeze aceeași locație. Variabila unei uniuni anonime poate fi trimisă fără operatorul punct (.) Normal.

int main () {union {// definiți uniunea anonimă cu numele tipului. int x, char c; float f; }; x = 10; // a referit variabila de unire cu out point operator cout <

În uniunea anonimă nu este permisă nici o funcție de membru, nu poate conține date private sau protejate, iar uniunea anonimă globală trebuie specificată ca „statică”.

Punctele de reținut pentru declarația sindicală normală.

  • Definiția unei uniuni poate conține, de asemenea, constructor și destructor.
  • Uniunea oferă mai multe moduri de a vizualiza aceeași locație de memorie.
  • Unirea nu poate moșteni clasa de niciun fel.
  • Unirea nu poate fi o clasă de bază.
  • Uniunea nu poate avea funcția de membru virtual.
  • Unirea nu poate avea o variabilă statică.
  1. Structura utilizează diferite locații de memorie pentru diferiți membri. Prin urmare, valoarea distinctă poate fi atribuită tuturor membrilor. Dar, uniunea alocă aceeași locație de memorie tuturor membrilor. Prin urmare, o valoare unică poate fi atribuită tuturor membrilor.
  2. Structura are o locație de memorie diferită pentru toți membrii; prin urmare, poate conține mai multe valori simultan și, după cum știm, uniunea are aceeași locație de memorie pentru toți membrii, prin urmare, poate stoca o singură valoare la un moment dat.
  3. În general, dimensiunea totală a structurii este mai mare decât dimensiunea totală a uniunii, deoarece mărimea unei structuri este suma dimensiunii tuturor membrilor structurilor, iar mărimea uniunii este mărimea membrului cel mai mare tip.
  4. Structura oferă o singură vedere a fiecărei locații, în timp ce unirea oferă multiple vizualizări ale unei singure locații.
  5. Puteți declara o uniune anonimă, dar nu o structură anonimă.

asemănări:

  • Atât structura cât și uniunea au același mod de a se declara, creând variabile și același mod de acces la membrii variabilelor.
  • Atât Structura cât și uniunea pot fi trecute la o funcție prin ambele metode apel prin valoare și apelare prin referință.
  • Atât Structura, cât și uniunea sunt tipuri de date de container și conțin un obiect de orice tip de date, inclusiv alte structuri, uniune, tablou ca membri ai acestora.

Concluzie:

Ambele, structura și uniunea sunt tipul de date al containerului care conține membrul diferitelor tipuri. Dar structurile sunt utilizate atunci când trebuie să stocăm o valoare distinctă pentru toți membrii dintr-o locație de memorie distinctă. Uniunile sunt utilizate atunci când este nevoie de conversia de tip.