Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Объединения (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; }
|