1) Ключевое слово union или объединение является специальным видом класса и используется для сокращения занимаемой памяти данными. Типы данных, перечисленные в объединении используют одну и ту же область памяти - размером с наибольший тип.
2) Доступ к элементам объединения осуществляется как к обычным членам класса, через операторы . (точка) для объединения и -> (минус больше) для указателя на объединение.
#include <iostream> // cout, endl
using namespace std;
union un_val{ // Перечисление для хранения аргументов и результатов имеет размер double
bool bval; // bool
int ival; // int
double dval; // double
};
void my_func(union un_val& res){ // Функция принимает объединение res по ссылке
res.ival = 263; // Меняет значение ival
}
int main(){
union un_val a; // Создаем объединение a
a.ival = 0; // Устанавливаем поле ival в ноль
cout << a.ival << endl; //0
my_func(a); // Вызываем функцию меняющую значение ival на 10
cout << a.ival << endl; //263 шестнадцатеричное значение 0x00000107
cout << a.bval << endl; //7 bool занимает младший байт объединения (0x07)
cout << a.dval << endl; //1.26975e-321 double занимает 8 байтов объединения и в старших 4х байтах "мусор"
}