Differenza tra struttura e unione

Autore: Laura McKinney
Data Della Creazione: 1 Aprile 2021
Data Di Aggiornamento: 7 Maggio 2024
Anonim
DIFFERENZA SIMMETRICA su INSIEMI + UNIONE, INTERSEZIONE, DIFFERENZA - CODING INTERVIEW PREP
Video: DIFFERENZA SIMMETRICA su INSIEMI + UNIONE, INTERSEZIONE, DIFFERENZA - CODING INTERVIEW PREP

Contenuto


C ++ consente tutti e cinque i modi forniti dal linguaggio C per creare dati personalizzati. Questi cinque modi sono "struttura", "campo bit", "unione", "enumerazione", "typedef". Nell'articolo che segue studieremo la differenza tra struttura e unione. La struttura e l'unione sono entrambi i tipi di dati contenitore che possono contenere dati di qualsiasi "tipo". L'unica differenza principale che distingue la struttura e l'unione è che la struttura ha una posizione di memoria separata per ciascuno dei suoi membri, mentre i membri di un'unione condividono la stessa posizione di memoria.

Comprendiamo la differenza tra struttura e unione, insieme a un grafico di confronto.

  1. Tabella di comparazione
  2. Definizione
  3. Differenze chiave
  4. Somiglianze
  5. Conclusione

Tabella di comparazione

Base di confrontoStrutturaUnione
Di baseLa posizione di memoria separata viene assegnata a ciascun membro della struttura.Tutti i membri del sindacato condividono la stessa posizione di memoria.
Dichiarazionenome_struttura {
digitare element1;
digitare element2;
.
.
} variabile1, variabile2, ...;
union u_name {
digitare element1;
digitare element2;
.
.
} variabile1, variabile2, ...;
parola chiavestructunione
TagliaDimensione della struttura = somma delle dimensioni di tutti i membri dei dati.Dimensione dell'Unione = dimensione dei membri più grandi.
Valore del negozioMemorizza valori distinti per tutti i membri.Memorizza lo stesso valore per tutti i membri.
Al tempoUna struttura memorizza più valori, dei diversi membri, della struttura.Un'unione memorizza un singolo valore alla volta per tutti i membri.
Modo di visioneFornire un modo unico per visualizzare ogni posizione di memoria.Fornire più modi per visualizzare la stessa posizione di memoria.
Caratteristica anonimaNessuna funzione anonima.L'unione anonima può essere dichiarata.

Definizione di struttura

La struttura è una raccolta di variabili di diversi tipi di dati, a cui fa riferimento un nome comune. Le variabili in una struttura sono chiamate "membri". Per impostazione predefinita, tutti i membri di una struttura sono "pubblici". Quando si dichiara una struttura, si crea un modello, che può essere utilizzato per creare oggetti struttura, condividendo la stessa organizzazione di membri di dati e funzioni membro. La dichiarazione della struttura è sempre preceduta dalla parola chiave "struct", che indica al compilatore che una struttura è stata dichiarata. Facciamo un esempio.


Facciamo un esempio.

struct employee {nome stringa; stringa nome_azienda; città della stringa; } Emp1, EMP2;

Qui, dichiariamo una struttura per la memorizzazione delle informazioni dei dipendenti. La dichiarazione è terminata da un punto e virgola, poiché la dichiarazione di struttura è un'istruzione e, in C ++, la dichiarazione è terminata da un punto e virgola.

Il nome assegnato a una struttura definisce un "tipo" (nell'esempio sopra il nome della struttura è "impiegato"). Le variabili di questi tipi potrebbero essere create, come sopra, abbiamo creato due variabili "emp1" e "emp2" di tipo "dipendente". Nell'esempio sopra, abbiamo creato una variabile "struttura" subito dopo la dichiarazione; in alternativa, potrebbe essere creato separatamente.

struct impiegato emp1, emp2; // la parola chiave struct non è obbligatoria.

I membri di una variabile di struttura possono essere inizializzati o è possibile accedervi utilizzando l'operatore punto (.).


emp1.name = "Ashok";

Le informazioni contenute in una variabile di struttura possono essere assegnate a un'altra variabile di struttura dello stesso tipo come segue.

emp1.name = "Ashok"; emp1.company_name = "Teckpix"; emp1.city = "Delhi"; EMP2 = dip1; // assegnando i valori del membro di emp1 a emp2. cout <

Qui, abbiamo assegnato la variabile di struttura "emp1" a "emp2", quindi "emp1" copia tutto il valore dei suoi membri nel membro corrispondente di "epm2".

Il membro della variabile struttura può essere passato alla funzione.

Funz (emp1.city);

L'intera variabile di struttura può essere passata alla funzione, sia con i metodi call by value che call by reference.

Funt (dip1); // chiama funzione per chiamata per metodo valore. . . void funct (struct employee emp) {// recupero dei valori dei membri di emp1. cout <

In questo caso, la modifica del valore di un membro della variabile di struttura non si rifletterà all'esterno della funzione poiché una variabile viene passata per chiamata dal metodo value. Ora facciamo la stessa cosa chiamando per metodo di riferimento.

Funt (& dip1); // chiama la funzione per chiamata per metodo di riferimento. . . void funct (struct employee * emp) {// indirizzo ricevente di emp1. EMP> city = "Nur"; // cambia il valore del membro (città) della variabile struttura emp1. . }

Qui, la variabile di struttura viene passata per riferimento, quindi anche la modifica del valore dei membri della variabile di struttura si riflette all'esterno della funzione.

impiegato dipendente * emp; // decimale il puntatore alla struttura di tipo dipendente. emp = & dip1; // assegna l'indirizzo di emp1 al puntatore. emp-> city // pointer accede alla città membro di emp1.

È anche possibile creare il puntatore alla struttura; contiene l'indirizzo della variabile struttura.

Nella struttura l'inizializzazione aggregata è consentita quando la definizione della struttura non contiene alcun costruttore definito dall'utente o funzioni virtuali o classe base o campo privato o protetto.

int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Possibile in quanto la struttura del dipendente non contiene nessuna delle cose sopra menzionate.

Definizione di Unione

Un'unione è una posizione di memoria condivisa da due o più tipi diversi di variabili dichiarati in un singolo tipo di unione. La parola chiave utilizzata per dichiarare un'unione è "unione". In C ++, un'unione può contenere sia la funzione membro che le variabili. Per impostazione predefinita, tutti i membri del sindacato sono "pubblici". La dichiarazione dell '"unione" è simile alla dichiarazione della struttura.

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

Qui, avevamo dichiarato un sindacato chiamato u_type. I membri di u_type sono "x" di tipo intero, "c" di tipo carattere e "f" di tipo float. Avevamo anche creato le variabili unione "u1" e "u2", di tipo "u_type", subito dopo la dichiarazione di unione. Possiamo anche dichiarare la variabile del sindacato separatamente dalla dichiarazione di un sindacato.

int main () {union u_type u1, u2; // L'unione delle parole chiave non è obbligatoria in C ++. }

L'accesso ai membri dell'unione può essere fatto usando l'operatore punto (.), Preceduto dalla variabile union e seguito il membro di quella variabile.

u1.x = 10;

Come le strutture, l'inizializzazione aggregata non è possibile in un'unione. Come sappiamo l'unione condivide la stessa posizione di memoria per tutto il suo membro alla volta viene inizializzata una sola variabile e tutta la variabile viene automaticamente aggiornata con il valore inizializzato.

u1.x = 10; cout <

Se provi a modificare il valore di qualsiasi membro di "u1". L'altro membro verrà automaticamente aggiornato a quel valore.

u1.c = 65; cout <

Lo spazio assegnato all'unione è uguale alla dimensione del membro più grande dell'unione. Dato che il byte assegnato a "char" è 1 byte, "int" è 4 byte e "float" è 4 byte, quindi la dimensione più grande è 4 byte. Quindi, la memoria assegnata a "u1" e "u2" è di 4 byte.

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

Il puntatore all'unione può essere creato esattamente come nella struttura. Il puntatore contiene l'indirizzo dell'unione.

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

Come la struttura, l'unione può anche essere passata alle funzioni da entrambi i metodi, ovvero chiamata per valore e chiamata per riferimento.

Funz (u1); // chiama funzione per chiamata per metodo valore. . . void funct (union u_type un) {// recupera il valore del membro di u1. cout <

Ora chiamiamo la funzione usando call per metodo di riferimento.

Funz (e u1); // funzione di chiamata per chiamata con il metodo di riferimento. . . void funct (union u_type un) {// richiama l'indirizzo di u1. un-> x = 20. }

Esiste un tipo speciale di unione in C ++ chiamata Unione Anonima ”. L'unione anonima non può avere il nome del tipo e non è possibile creare alcuna variabile di tale unione. È solo per dire al compilatore che le sue variabili membro devono condividere la stessa posizione. La variabile di un'unione anonima può essere riferita senza il normale punto (.) Operatore.

int main () {union {// definisce l'unione anonima senza il nome del tipo. int x, char c; float f; }; x = 10; // ha fatto riferimento alla variabile union senza out dot cout <

Nell'unione anonima non è consentita alcuna funzione membro, non può contenere dati privati ​​o protetti e l'unione anonima globale deve essere specificata come "statica".

I punti da ricordare per la normale dichiarazione sindacale.

  • La definizione di unione può contenere anche costruttore e distruttore.
  • L'unione fornisce i modi multipli per visualizzare la stessa posizione di memoria.
  • L'unione non può ereditare la classe di alcun tipo.
  • Il sindacato non può essere una classe base.
  • L'unione non può avere la funzione membro virtuale.
  • L'unione non può avere una variabile statica.
  1. La struttura utilizza una posizione di memoria diversa per membri diversi. Quindi, il valore distinto può essere assegnato a tutti i membri. Ma l'unione assegna la stessa posizione di memoria a tutti i membri. Pertanto, un singolo valore può essere assegnato a tutti i membri.
  2. La struttura ha una posizione di memoria diversa per tutti i membri; quindi, può contenere più valori alla volta e, come sappiamo, l'unione condivide la stessa posizione di memoria per tutti i membri, quindi, può memorizzare un singolo valore alla volta.
  3. Generalmente, la dimensione totale della struttura è maggiore della dimensione totale dell'unione perché la dimensione di una struttura è la somma delle dimensioni di tutti i membri delle strutture e la dimensione dell'unione è la dimensione del membro del tipo più grande.
  4. La struttura fornisce una vista singola di ogni posizione, mentre l'unione fornisce le viste multiple di una singola posizione.
  5. Puoi dichiarare un'unione anonima ma non una struttura anonima.

Somiglianze:

  • Sia la struttura che l'unione hanno lo stesso modo di dichiararsi, creare variabili e lo stesso modo di accedere ai membri delle variabili.
  • Sia la struttura che l'unione possono essere passate a una funzione mediante entrambi i metodi call by value e call by reference.
  • Sia la struttura che l'unione sono tipi di dati contenitore e contengono un oggetto di qualsiasi tipo di dati, inclusi altri elementi struttura, unione, matrice.

Conclusione:

Sia struttura che unione sono il tipo di dati contenitore che contiene il membro di diversi tipi. Ma le strutture vengono utilizzate quando è necessario memorizzare un valore distinto per tutti i membri in una posizione di memoria distinta. I sindacati vengono utilizzati quando è necessaria la conversione del tipo.