Объявление union
Объявление union создает тип данных,
все члены которого разделяют одну и ту же
область памяти. Размер такого объединения
равен размеру самого большого его члена,
а в один момент времени активным может
быть только один член. Если записать
значение в один член, то предыдущее
значение другого члена будет затёрто.
В отличие от struct и class,
члены объединения по умолчанию являются
публичными (public). Объединение
может содержать конструкторы, деструкторы
и методы, но не может наследоваться и не
может иметь виртуальных функций. Также
нельзя хранить в объединении типы, которые
имеют нетривиальные конструкторы или
деструкторы (например, std::string),
за исключением случая, когда они не
являются активными.
Объявление объединения начинается с
ключевого слова union, за которым
следует имя типа и список членов в
фигурных скобках. После закрывающей
фигурной скобки обязательно ставится
точка с запятой.
Синтаксис
union Name
{
type1 member1;
type2 member2;
// ...
};
Пример
Давайте создадим объединение Value,
которое может хранить целое число,
вещественное число или символ:
#include <iostream>
using namespace std;
union Value
{
int i;
double d;
char c;
};
int main()
{
Value v;
v.i = 42;
cout << v.i << endl;
return 0;
}
Результат выполнения кода:
42
Пример
Поскольку все члены разделяют одну область памяти, запись в один член изменяет значение другого. Давайте убедимся в этом:
#include <iostream>
using namespace std;
union Value
{
int i;
char c;
};
int main()
{
Value v;
v.i = 65;
cout << v.i << endl;
cout << v.c << endl;
return 0;
}
Результат выполнения кода:
65
"A"
Число 65 в таблице ASCII
соответствует символу 'A', поэтому
оба члена показывают одно и то же
значение с разной интерпретацией.
Пример
Объединение может содержать методы и конструкторы. Давайте создадим объединение с удобным методом для вывода активного значения:
#include <iostream>
using namespace std;
union Value
{
int i;
double d;
Value() : i(0) {}
void printInt()
{
cout << i << endl;
}
};
int main()
{
Value v;
v.i = 123;
v.printInt();
return 0;
}
Результат выполнения кода:
123
Смотрите также
-
объявление
struct,
которое создает структуру с публичными членами -
объявление
class,
которое создает класс с приватными членами -
объявление
enum,
которое создает перечисление -
объявление
enum class,
которое создает строго типизированное перечисление