Kris Jamsa Wygraj Z C++ lekcja20


Lekcja 19LEKCJA 19
Korzystanie z unii
Podczas poprzedniej lekcji dowiedziałeś się, w jaki sposób można grupować
powiązane informacje w jedną zmienną przy użyciu struktur języka C++. Przy
pisaniu bardziej złożonych programów może się zdarzyć, że będziesz w nich chciał
w różny sposób traktować jedną informację. Ponadto może być tak, że będziesz
musiał korzystać z dwóch lub więcej danych, ale w jednej chwili będziesz
operować tylko na jednej z nich. W takich sytuacjach będziesz mógł używać unii
do przechowywania informacji w swoich programach. Jak zobaczysz, unie są bardzo
podobne do struktur, które poznałeś podczas lekcji 18. Pod koniec tej lekcji
będziesz rozumiał następujące zagadnienia podstawowe:
Unie języka C++ są bardzo podobne do struktur, z wyjątkiem sposobu, w jaki C++
przechowuje je w pamięci i tego, że w jednym momencie unia może reprezentować
wartość tylko jednej składowej.
Unia jest strukturą danych, która podobnie jak struktura zawiera elementy
noszące nazwę składowych.
Unia definiuje szablon, przy użyciu którego można deklarować w programie
zmienne.
Operator wyboru składowej oznaczany kropką daje Ci dostęp do składowych unii.
Aby funkcja mogła zmieniać składowe unii, musisz jej przekazywać adres
zmiennej unii.
Można definiować unie bez nazwy.
Jak się przekonasz, unie są bardzo podobne do struktur języka C++, jednak C++
przechowuje unie w pamięci zupełnie inaczej niż struktury.


W jaki sposób C++ umieszcza unie w pamięci
W programie w C++ unia jest bardzo podobna do struktury. Na przykład oto
definicja unii pod nazwą dystans zawierającej dwie składowe:
union dystans {
int mil;
long metrow;
};

Tak jak w przypadku struktury, definicja unii nie przydziela pamięci. Natomiast
określa szablon, który potem można będzie wykorzystywać do deklarowania
zmiennych. Możesz zadeklarować zmienną unii dwoma sposobami:
union dystans {
int mil;
long metrow;
} japonia, niemcy, francja;

union dystans {
int mil;
long metrow;
};

dystans japonia, niemcy, francja;



Jak widzimy, unia zawiera dwie składowe mil i metrow. Powyższe deklaracje tworzą
zmienne, przy użyciu których możesz przechowywać odległości dla podanych Krajów.
Tak jak dla struktur, możesz w programie przypisywać wartość którejś składowej
unii. Jednak, w przeciwieństwie do struktur, w danym momencie można przypisywać
wartość tylko jednej składowej unii. Gdy deklarujesz zmienną unii, to kompilator
przydziela jej tylko tyle pamięci, ile jest potrzebne do przechowywania
największej składowej unii. Dla unii dystans kompilator przydzieli ilość pamięci
potrzebną do przechowywania wartości typu long, jak widać na rysunku 8.
Rysunek 8.
C++ przydziela unii tyle pamięci, ile potrzeba do przechowywania największej
składowej



Załóżmy, że twój program przypisuje w następujący sposób wartość składowej mil:
japonia.mil = 12123;

Jeśli później przypiszesz wartość składowej metrow, to wartość przypisana
składowej mil zostanie zastąpiona przez nową liczbę.
Przedstawiony poniżej program UNIA.CPP ilustruje sposób wykorzystania unii
dystans. Najpierw program przypisuje wartość składowej mil i ją wyświetla.
Następnie przypisuje wartość składowej metrow i też ją wyświetla. W tym momencie
wartość składowej mil jest już zamazana.
#include

void main(void)
{
union dystans {
int mil;
long metrow;
} spacer;

spacer.mil = 5;

cout << "Dystans spaceru w milach wynosi " << spacer.mil << endl;

spacer.metrow = 10000;

cout << "Dystans spaceru w metrach wynosi " << spacer.metrow << endl;
}

Jak widzimy, program korzysta z wartości składowych unii przy użyciu notacji z
kropką, tak jak przy realizowaniu dostępu do składowych struktury podczas lekcji
18.
Unie mogą przechowywać w jednej chwili wartość tylko jednej składowej.
Unia jest strukturą danych, która, podobnie jak struktura, może przechowywać
powiązane informacje w jednej zmiennej. Jednak w przeciwieństwie do struktur,
unia przechowuje w danym momencie wartość tylko jednej składowej. Innymi słowy,
gdy przypisujesz wartość jednej składowej unii, zastępujesz wartość wcześniej
przypisaną którejkolwiek ze składowych. Unia definiuje szablon, który można
później wykorzystywać w deklaracjach zmiennych. Gdy kompilator C++ napotyka
definicję unii, to przydziela tyle pamięci, ile jest potrzebne do przechowywania
największej składowej unii.


Korzystanie z unii bez nazwy
Dzięki uniom bez nazwy można uprościć sposób wykorzystywania składowych unii w
programach, które używają unii, aby zaoszczędzić na pamięci lub aby utworzyć
alias dla wartości. Na przykład, załóżmy, że piszesz program, w którym potrzebne
są dwie zmienne: mil i metrow i że w jednej chwili korzysta on tylko z jednej z
tych zmiennych. Gdybyś użył do tego unii dystans, tak jak to opisaliśmy, to
dostęp do jej składowych miałbyś poprzez dystans.mil i dystans.metrów. Innym
rozwiązaniem jest zdefiniowanie unii bez nazwy:
union {
int mil
long metrow;
};

Jak widzimy, ta deklaracja nie zawiera nazwy unii, ani nie deklaruje zmiennych
typu unii. W programie natomiast możesz odwoływać się do nazw składowych mil i
metrow bez używania kropki. Przedstawiony poniżej program ANONIM.CPP tworzy unię
bez nazwy zawierającą składowe mil i metrow. Jak widać, program operuje na
składowych tak jak na zwykłych zmiennych. Jednak różnią się one od zmiennych
tym, że jeśli którejś ze składowych nadajesz wartość, to wartość drugiej zostaje
zniszczona:
#include

void main(void)
{
union {
int mil;
long metrow;
};

mil = 10000;

cout << "Wartość mil wynosi " << mil << endl;

metrow = 150000;

cout << "Wartość metrow wynosi " << metrow << endl;
}

Jak widzimy, dzięki użyciu unii bez nazwy program oszczędza pamięć bez
konieczności zaciemniania kodu przez pisanie nazwy unii i kropki przy dostępie
do wartości składowych.
Dzięki uniom bez nazwy programy mogą oszczędzać pamięć
Unie bez nazwy pozwalają programom oszczędzać pamięć bez konieczności używania
notacji z kropką. Poniższa instrukcja definiuje unię bez nazwy, która może
przechowywać jeden z dwóch tekstów:
union {
char krotka_nazwa[13];
char dluga_nazwa[255];
};



Zapamiętaj
Podczas tej lekcji dowiedziałeś się, w jaki sposób możesz tworzyć unie w swoich
programach. Jak już wiesz, format unii jest podobny do formatu struktury. Jednak
C++ przechowuje unie w zupełnie inny sposób niż struktury. Z lekcji 10
dowiedziałeś się, że aby funkcja mogła zmienić wartości parametrów, to program
musi jej przekazywać te parametry przy użyciu wskaźników (czyli adresów
pamięci). W programach, które napisaliśmy od tego czasu, korzystaliśmy ze
wskaźników do tablic i tekstów. Podczas lekcji 20 przyjrzymy się operacjom na
wskaźnikach. Zanim jednak przejdziemy do lekcji 20 upewnij się, że opanowałeś
już następujące zagadnienia podstawowe:
Gdy deklarujesz unię, to kompilator C++ przydziela jej tylko tyle pamięci, ile
jest potrzebne do przechowywania największej składowej unii.
Zdefiniowanie unii nie jest związane z przydzielaniem pamięci, ale tworzy
tylko szablon, przy użyciu którego można później deklarować zmienne.
Program ma dostęp do składowej unii przy użyciu kropki. Podczas przypisywania
wartości składowej unii wartość przypisana wcześniej innej jej składowej
zostaje zniszczona. Innymi słowy, unia może w jednym momencie przechowywać
wartość tylko jednej składowej.
Jeśli zadeklarujesz w programie unię bez nazwy, to masz dostęp do jej
składowych tak jak do dowolnych zmiennych, bez kropki.



WsteczSpis treściDalej



Wyszukiwarka

Podobne podstrony:
Kris Jamsa Wygraj Z C lekcja32
Kris Jamsa Wygraj Z C lekcja 5
Kris Jamsa Wygraj Z C lekcja23
Kris Jamsa Wygraj Z C lekcja38
Kris Jamsa Wygraj Z C lekcja35
Kris Jamsa Wygraj Z C lekcja27
Kris Jamsa Wygraj Z C lekcja34
Kris Jamsa Wygraj Z C lekcja18
Kris Jamsa Wygraj Z C lekcja17
Kris Jamsa Wygraj Z C lekcja25
Kris Jamsa Wygraj Z C lekcja14
Kris Jamsa Wygraj Z C lekcja36
Kris Jamsa Wygraj Z C lekcja 4
Kris Jamsa Wygraj Z C lekcja33
Kris Jamsa Wygraj Z C lekcja 7
Kris Jamsa Wygraj Z C lekcja30
Kris Jamsa Wygraj Z C lekcja12
Kris Jamsa Wygraj Z C lekcja28
Kris Jamsa Wygraj Z C lekcja 6

więcej podobnych podstron