Объединения
Использование объединений
Допустимы массивы объединений и указатели на объединения. Объединения могут передаваться функции как параметры и возвращаться функцией.
Операции, применимые к структурам, аналогичны и для объединений, т.е. законны присваивание объединения и копирование его как единого целого, взятие адреса от объединения и доступ к отдельным его элементам.
Объединение как элемент структуры
Объединения часто включаются в структуры, один из элементов которых является ключом, указывающим тип хранимого в памяти элемента объединения.
Например:
//содержит информацию о работающих служащих и пенсионерах
struct mail {
char id; // a - active (), r - retired()
union {
struct {
char name[30];
char dept[10];
char location[3];
} active;
struct {
char name[30];
char street[20];
char city_state[3];
char zip[5];
} retired;
} info;
} person;Структура типа struct mail используется для хранения почтового адреса работающего служащего или пенсионера ( рис. 17.1). При заполнении структуры этого типа информацией в нее заносится порция данных, соответствующая элементам active или retired объединения info. Поле id устанавливается равным 'a' или 'r' для указания фактически записанного в объединении элемента. При применении объединения используется меньше памяти, чем в случае применения структуры, которая имела бы идентичные поля, но некоторые из них не использовались бы.
Переменные с изменяемой структурой
Очень часто некоторые объекты программы относятся к одному и тому же классу, отличаясь лишь некоторыми деталями. В таких случаях используются переменные с изменяемой структурой. Рассмотрим, например, представление геометрических фигур. Общая информация о фигурах может включать такие элементы, как площадь, периметр. Однако соответствующая информация о геометрических размерах может оказаться различной в зависимости от их формы.
Пример 2. Информация о геометрических фигурах представляется на основе комбинированного использования структуры и объединения.
struct figure {
double area,perimetr; // общие компоненты
int type; // признак компонента
union { // перечисление компонент
double radius; // окружность
double a[2]; // прямоугольник
double b[3]; // треугольник
} geom_fig;
} fig1, fig2;В общем случае каждый объект типа figure будет состоять из трех компонентов: area, perimetr, type. Компонент type называется меткой активного компонента, так как он используется для указания, какой из компонентов объединения geom_fig является активным в данный момент. Такая структура называется переменной структурой, потому что ее компоненты меняются в зависимости от значения метки активного компонента (значение type ). Отметим, что вместо компоненты type типа int, целесообразно было бы использовать перечисляемый тип. Например, такой
enum figure_chess {CIRCLE, BOX, TRIANGLE};Константы CIRCLE, BOX, TRIANGLE получат значения соответственно равные 0, 1, 2. Переменная type может быть объявлена как имеющая перечислимый тип:
enum figure_chess type;
В этом случае компилятор С++ предупредит программиста о потенциально ошибочных присваиваниях, таких, например, как figure.type = 40 ;
В общем случае переменная структуры будет состоять из трех частей: набор общих компонент, метки активного компонента и части с меняющимися компонентами. Общая форма переменной структуры, имеет следующий вид:
struct {
ОбщиеКомпоненты; МеткаАктивногоКомпонента;
union {
ОписаниеКомпоненты1;
ОписаниеКомпоненты2;
...................
ОписаниеКомпонентыN;
} ИдентификаторОбъединения;
} ИдентификаторСтруктуры;Пример 3. Определения переменной структуры с именем helth_record
struct { // общая информация
char name[25]; // имя
int age; // возраст
char sex; // пол
// метка активного компонента(семейное положение)
enum merital_status ins;
// переменная часть
union { // холост
// нет компонент
struct { // состоит в браке
char marriage_date[8];
char spouse_name[25];
int no_children;
} marriage_info;
// разведен */
char date_divorced[8];
} marital_info;
} health_record;
enum marital_status { SINGLE, // холост
MARRIGO, // женат
DIVOREED // разведен
};Обращаться к компонентам структуры можно при помощи ссылок:
helth_record.nаme helth_record.ins helth_record.marriage_info.marriage_date
Ключевые термины
Значение указателя на объединение – это адрес расположения элементов объединения.
Объединение (смеси) – объект, который в каждый момент времени содержит один из нескольких элементов различных типов.
Переменные с изменяемой структурой – это переменные структурного типа, у которых компоненты меняются в зависимости от значения метки активного компонента.
Размер объединения – это объем памяти, занимаемой объединением.
Указатель на объединение – это указатель на расположение элементов объединения в памяти.
Элементы объединения – это множество переменных, определяемых именем переменной объединения.
Краткие итоги
- Объединения являются частным случаем структур.
- Все компоненты объявления структур применимы и при объявлении объединений.
- Главной особенностью объединения является то, что для каждого из объявленных элементов выделяется одна и та же область памяти.
- Доступ к элементам объединения аналогичен обращению к элементам структуры.
- Все поля объединения располагаются по одному и тому же адресу.
- В конкретный момент времени активным может быть только одно поле объединения.
- Размер объединения определяется как максимальная величина длин его элементов.
- Указатель на объединение обеспечивает доступ только к одному любому элементу объединения.
- Структура может являться переменной, если ее компоненты меняются в зависимости от значения метки активного компонента.
