Объединения
A union — это пользовательский тип данных или класса, который в любой конкретный момент содержит только один объект из списка своих членов (при этом такой объект может представлять собой тип массива или класса).
union [tag] { member-list } [declarators]; [union] tag declarators;
Параметры
tag
Имя типа, присваиваемое объединению.member-list
Список типов данных, которые может содержать объединение. См. заметки.declarators
Список деклараторов с указанием имен объединения. Дополнительные сведения см. в разделе Общие сведения о деклараторах.
Заметки
В member-lis объединения указываются типы данных, которые может содержать объединение. Объединению требуется достаточный объем памяти для хранения наиболее крупного члена из member-list. Дополнительные сведения см. в разделе Объявления объединений (Справочник по языку C).
Объявление объединения
Объявление объединения начинается с ключевого слова union и содержит список членов, заключенный в фигурные скобки:
// declaring_a_union.cpp
union DATATYPE // Declare union type
{
char ch;
int i;
long l;
float f;
double d;
int *int_ptr;
} var1; // Optional declaration of union variable
int main()
{
}
Использование объединения
Объединение в C++ представляет собой ограниченную форму типа класса. В нем могут содержатся спецификаторы доступа (public, protected, private), данные-члены и функции-члены, включая конструкторы и деструкторы. В него не могут входить виртуальные функции и статические элементы данных. Он не может ни использоваться в качестве базового класса, ни иметь базовые классы. По умолчанию элементы объединения имеют доступ public.
В C++ нет необходимости использовать ключевое слово union при объявлении переменной объединения.
DATATYPE var3; // C++ declaration of a union variable
Переменная типа объединения может содержать одно значение любого типа, объявленного в объединении. Для доступа к члену объединения используется оператор выбора члена (.):
var1.i = 6; // Use variable as integer
var2.d = 5.327; // Use variable as double
Объединение можно объявить и инициализировать в одной и той же инструкции. Для этого необходимо присвоить ему выражение, заключенное в фигурные скобки. Выражение вычисляется и присваивается первому полю в объединении.
Пример
#include <iostream>
using namespace std;
union NumericType
{
int iValue;
long lValue;
double dValue;
};
int main()
{
union NumericType Values = { 10 }; // iValue = 10
cout << Values.iValue << '\n';
Values.dValue = 3.1416;
cout << Values.dValue);
}
Вывод
10
3.141600
На следующем рисунке показана общая съема размещения объединения NumericType в памяти.
Хранение данных в объединении NumericType