Опубликован: 02.02.2011 | Доступ: свободный | Студентов: 3381 / 990 | Оценка: 4.43 / 3.57 | Длительность: 33:06:00
Специальности: Программист
Лекция 18:

Объединения

< Лекция 17 || Лекция 18: 123 || Лекция 19 >

Использование объединений

Допустимы массивы объединений и указатели на объединения. Объединения могут передаваться функции как параметры и возвращаться функцией.

Операции, применимые к структурам, аналогичны и для объединений, т.е. законны присваивание объединения и копирование его как единого целого, взятие адреса от объединения и доступ к отдельным его элементам.

Объединение как элемент структуры

Объединения часто включаются в структуры, один из элементов которых является ключом, указывающим тип хранимого в памяти элемента объединения.

Например:

//содержит информацию о работающих служащих и пенсионерах
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' для указания фактически записанного в объединении элемента. При применении объединения используется меньше памяти, чем в случае применения структуры, которая имела бы идентичные поля, но некоторые из них не использовались бы.

Объединение как элемент структуры

Рис. 17.1. Объединение как элемент структуры

Переменные с изменяемой структурой

Очень часто некоторые объекты программы относятся к одному и тому же классу, отличаясь лишь некоторыми деталями. В таких случаях используются переменные с изменяемой структурой. Рассмотрим, например, представление геометрических фигур. Общая информация о фигурах может включать такие элементы, как площадь, периметр. Однако соответствующая информация о геометрических размерах может оказаться различной в зависимости от их формы.

Пример 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

Ключевые термины

Значение указателя на объединение – это адрес расположения элементов объединения.

Объединение (смеси)объект, который в каждый момент времени содержит один из нескольких элементов различных типов.

Переменные с изменяемой структурой – это переменные структурного типа, у которых компоненты меняются в зависимости от значения метки активного компонента.

Размер объединения – это объем памяти, занимаемой объединением.

Указатель на объединение – это указатель на расположение элементов объединения в памяти.

Элементы объединения – это множество переменных, определяемых именем переменной объединения.

Краткие итоги

  1. Объединения являются частным случаем структур.
  2. Все компоненты объявления структур применимы и при объявлении объединений.
  3. Главной особенностью объединения является то, что для каждого из объявленных элементов выделяется одна и та же область памяти.
  4. Доступ к элементам объединения аналогичен обращению к элементам структуры.
  5. Все поля объединения располагаются по одному и тому же адресу.
  6. В конкретный момент времени активным может быть только одно поле объединения.
  7. Размер объединения определяется как максимальная величина длин его элементов.
  8. Указатель на объединение обеспечивает доступ только к одному любому элементу объединения.
  9. Структура может являться переменной, если ее компоненты меняются в зависимости от значения метки активного компонента.
< Лекция 17 || Лекция 18: 123 || Лекция 19 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!