Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Объединения (union)






Объединение (union) представляет собой частный случай структуры, все поля которой располагаются по одному и тому же адресу. Формат описания такой же, как у структуры, только вместо ключевого слова struct используется слово union.

 

union [ имя_типа ]

{

тип_1 элемент_1;

тип_2 элемент_2;

...

тип_n злемент_n;

} [ список_описателей ];

 

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

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

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

- экономия памяти в тех случаях, когда известно, что больше одного поля одновременно не требуется;

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

 

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

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

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

Например, пусть в магазине имеется возможность использования различных способов оплаты (кредитная карта, чек, наличные). Тогда в программе учета одновременно нам необходимо будет хранить только одно из значений, тогда как остальные нас не интересуют.

 

#include < iostream>

 

using namespace std;

 

int main()

{

enum paytype {СНЕСК, CARD, CASH};

 

paytype ptype;

 

union payment{

long check;

char card[25];

float sum;

}

 

//инициализация возможна только через первый элемент объединения

payment info = 24557695;

/* присваивание значений info и ptype */

 

ptype = CASH;

cin > > info.summ;

 

switch (ptype)

{

case CHECK: cout < < " Оплата чеком: " < < info.check; break;

case CARD: cout < < " Оплата по карте: " < < info.card; break;

case CASH: cout < < " Оплата наличными: " < < info.sum; break;

};

 

return 0;

}

 

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

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

 

union {

int INT[2];

char CH[8];

} = {1, 2}

 

INT[0] = 25; // изменятся значения CH[0], CH[1], CH[2], CH[3]

CH[4] = 'a'; // изменится значение INT[1]

 

 

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

 

#include < iostream>

 

using namespace std;

 

int main()

{

enum paytype {CARD, СНЕСК, CASH};

 

struct payment

{

paytype ptype;

union{

char card[25];

long check;

};

};

 

payment info;

/* присваивание значений info и ptype */

 

ptype = CASH;

cin > > info.summ;

 

switch (info.ptype)

{

case CARD: cout < < " Оплата по карте: " < < info.card; break;

case CHECK: cout < < " Оплата чеком: " < < info.check; break;

case CASH: cout < < " Оплата наличными: " < < info.sum; break;

};

 

return 0;

}

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.