Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л6.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
168.45 Кб
Скачать

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

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

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 .

12.5. Тип void

Void это специальный спецификатор типа, указывающий на отсутствие каких-либо значений. Тип данных void (пустой) определяет пустое множество значений. Значение (несуществующее) объекта void нельзя использовать никаким образом, не могут применяться ни явное, ни неявное преобразования. Поскольку пустое выражение обозначает несуществующее значение, такое выражение может использоваться только как оператор “выражение” или как левый операнд в выражении в операции последовательного вычисления. Выражение может явно преобразовываться к типу void.

Тип void задается в следующих ситуациях:

- Пустой список параметров в объявлении функции:

int func(void); // функция не принимает аргументов

С++ обрабатывает 0 специальным образом

- Когда объявленная функция не возвращает значений:

void func(int n); // возвращаемое значение отсутствует

- В качестве родового указателя. Указатель на void является родовым указателем на все что угодно:

void *ptr; // далее ptr может быть установлен на любой объект

- Выражения с проверкой типа:

extern int errfunc(); // возвращает код ошибки

(void) errfunc(); // значение возврата теряется

17

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]