Объединения
Использование объединений
Допустимы массивы объединений и указатели на объединения. Объединения могут передаваться функции как параметры и возвращаться функцией.
Операции, применимые к структурам, аналогичны и для объединений, т.е. законны присваивание объединения и копирование его как единого целого, взятие адреса от объединения и доступ к отдельным его элементам.
Объединение как элемент структуры
Объединения часто включаются в структуры, один из элементов которых является ключом, указывающим тип хранимого в памяти элемента объединения.
Например:
//содержит информацию о работающих служащих и пенсионерах 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
Ключевые термины
Значение указателя на объединение – это адрес расположения элементов объединения.
Объединение (смеси) – объект, который в каждый момент времени содержит один из нескольких элементов различных типов.
Переменные с изменяемой структурой – это переменные структурного типа, у которых компоненты меняются в зависимости от значения метки активного компонента.
Размер объединения – это объем памяти, занимаемой объединением.
Указатель на объединение – это указатель на расположение элементов объединения в памяти.
Элементы объединения – это множество переменных, определяемых именем переменной объединения.
Краткие итоги
- Объединения являются частным случаем структур.
- Все компоненты объявления структур применимы и при объявлении объединений.
- Главной особенностью объединения является то, что для каждого из объявленных элементов выделяется одна и та же область памяти.
- Доступ к элементам объединения аналогичен обращению к элементам структуры.
- Все поля объединения располагаются по одному и тому же адресу.
- В конкретный момент времени активным может быть только одно поле объединения.
- Размер объединения определяется как максимальная величина длин его элементов.
- Указатель на объединение обеспечивает доступ только к одному любому элементу объединения.
- Структура может являться переменной, если ее компоненты меняются в зависимости от значения метки активного компонента.