Объединения (смеси)

Объединение подобно структуре, однако в каждый момент времени может использоваться (или другими словами быть ответным) только один из элементов объединения. Тип объединения может задаваться в следующем виде:

union[Тег] {ТипДанных Описатель 1;... ТипДанных Описатель N; }[СписокИдентификаторов]; Как и для структур наличие Тега и СпискаИдентификаторов необязательно.

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

Доступ к элементам объединения осуществляется тем же способом, что и к структурам. Тег объединения может быть формализован точно так же, как и тег структуры.

Объединение применяется для следующих целей:

• инициализации используемого объекта памяти, если в каждый момент времени только один объект из многих является активным;

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

Общий синтаксис объявления объединений во многом напоминает синтаксис объявления структур. Различия в следующем:

1. Объединения могут содержать битовые поля, но активно только одно из них.

2. В отличие от структур, объединения в С++ не могут использовать спецификаторы класса доступа public, private, protected. Все поля имеют доступ private.

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

union ret{ int I; float n} a={12};

4. Объединение не может участвовать в иерархии класса. Оно не может являться производным от какого-либо класса или быть базовым классом. Объединение может иметь конструктор.

5. Анонимные объединения не могут иметь компоненты-функции.

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

Пример:

union Spravka{ char fio[30]; char adres[80]; int vozrast; int telefon; } inform; union { int ax; char al[2]; } ua;

При использовании объекта inform типа union можно обрабатывать только тот элемент который получил значение, т.е. после присвоения значения элементу inform.fio, не имеет смысла обращаться к другим элементам. Объединение ua позволяет получить отдельный доступ к младшему ua.al[0] и к старшему ua.al[1] байтам двухбайтного числа ua.ax.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: