Объединения

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

Хранение данных в объединении числовых типов

См. также

Ссылки

Классы, структуры и объединения

Ключевые слова в C++

Анонимные объединения

class (C++)

struct (C++)