КАК C++ ХРАНИТ ОБЪЕДИНЕНИЯ
Внутри ваших программ объединения C++ очень похожи на структуры. Например, следующая структура определяет объединение с именем distance, содержащее два элемента:
union distance
{
int miles;
long meters;
};
Как и в случае со структурой, описание объединения не распределяет память. Вместо этого описание предоставляет шаблон для будущего объявления переменных. Чтобы объявить переменную объединения, вы можете использовать любой из следующих форматов:
union distance
{
union distance
{
int miles; int miles;
long meters; long meters;
} japan, germany, franee;
};
distance japan, germany, franee;
Как видите, данное объединение содержит два элемента: miles и meters. Эти объявления создают переменные, которые позволяют вам хранить расстояния до указанных стран. Как и для структуры, ваша программа может присвоить значение любому элементу. Однако в отличие от структуры значение может быть присвоено только одному элементу в каждый момент времени. Когда вы объявляете объединение, компилятор C++ распределяет память для хранения самого большого элемента объединения. В случае объединения distance компилятор распределяет достаточно памяти для хранения значения типа long, как показано на 19.
19. C++ распределяет память, достаточную для хранения только самого большого элемента объединения.
Предположим, что ваша программа присваивает значение элементу miles, как показано ниже:
japan.miles = 12123;
Если далее ваша программа присваивает значение элементу meters, значение, присвоенное элементу miles, теряется.
Следующая программа USEUNION.CPP иллюстрирует использование объединения distance. Сначала программа присваивает значение элементу
miles и выводит это значение. Затем программа присваивает значение элементу meters. При этом значение элемента miles теряется:
#include iostream.h
void main(void)
{
union distance
{
int miles;
long meters;
} walk;
walk.miles = 5;
cout "Пройденное расстояние в милях " walk.miles endl;
walk.meters = 10000;
cout "Пройденное расстояние в метрах " walk.meters endl;
}
Как видите, программа обращается к элементам объединения с помощью точки, аналогичная запись использовалась при обращении к элементам структуры в уроке 18.
Объединение хранит значение только одного элемента в каждый момент времени
Объединение представляет собой структуру данных, которая, подобно структуре C++, позволяет вашим программам хранить связанные части информации внутри одной переменной. Однако в отличие от структуры объединение хранит значение только одного элемента в каждый момент времени. Другими словами, когда вы присваиваете значение элементу объединения, вы перезаписываете любое предыдущее присваивание.
Объединение определяет шаблон, с помощью которого ваши программы могут позднее объявлять переменные. Когда компилятор C++ встречает определение объединения, он распределяет количество памяти, достаточное для хранения только самого большого элемента объединения.