Union

Rezor

Unia jest kolejnym obok struktury i klasy typem definiowanym przez użytkownika. Od pozostałych dwóch różni ją jednak to ze swoje składniki zapisuje w tym samym (współdzielonym) obszarze pamięci.

Co to oznacza w praktyce ?
Tylko tyle ze w danej chwili, unia może przechowywać wartość JEDNEJ ze swoich zmiennych składowych.

Unie definiujemy w następujący sposób:

union PrzykladowaUnia 
{
int i_zmienna_skladowa;
char c_zmienna_skladowa;
};

Rozmiar unii jest równy, rozmiarowi jej największego elementu.

cout << "unia = " << sizeof(PrzykladowaUnia); // Powinno zwrócić 4 (zależnie od kompilatora)

Do elementów zawartych w unii dostajemy się za pomocą operatora wyłuskania (czyli "."), lub za pomocą wskaźników (i operatora this "->")

PrzykladowaUnia obiekt_uni;
PrzykladowaUnia *wskaznik_na_unie;
wskaznik_na_unie = &obiekt_uni;
obiekt_uni.i_zmienna_skladowa = 5; // nadanie wartości 5 zmiennej
wskaznik_na_unie->i_zmienna_skladowa = 6 // nadanie tej samej zmiennej wartość 6

Jak już wcześniej wspomniałem w unii można przechowywać naraz wartość tylko jednej zmiennej co zobrazuje ten przykład:

PrzykladowaUnia obiekt_uni;
obiekt_uni.i_zmienna_skladowa = 5; // nadanie wartości 5 zmiennej
obiekt_uni.c_zmienna_skladowa = 'a'; // nadpisanie zawartości naszej uni znakiem "a";

cout << obiekt_uni.i_zmienna_skladowa; // taki zapis nie jest poprawny !! Unia przechowuje teraz znak "a" wiec nie możemy odnieść sie do obiektu typu int
cout << obiekt_uni.c_zmienna_skladowa; // teraz wszystko w porządku. Na ekran zostanie wypisana litera "a"

Unie mogą zawierać również funkcje :

union Unia_z_funkcja{
int liczba;
char znak;

void wypisz_liczbe(){
cout << liczba;
}

};

Dostęp do zmiennych w unii, możemy określać za pomocą operatorów private i public.
Ponieważ Unii nie można dziedziczyć Operator protected jest niedopuszczalny !

0 komentarzy