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 !