Справочник по C/C++
Объединения

Объединения — это тип класса, в котором все данные разделяют одну и туже область памяти. В языке c++ объединение может включать как функции-, так и данные- члены. Все члены объединения открыты по умолчанию. Для создания закрытых элементов необходимо использовать ключевое слово private. Общая форма объявления объединения выглядит следующим образом.

union имя_класса {
	//Открытые члены по умолчанию.
private:
	//Закрытые члены.
} список_объектов;

В языке C объединения могут содержать только данные-члены и ключевое слово private не поддерживается.

Элементы объединения перекрывают друг друга. Например, в записи

union tom {
	char ch;
	int x;
} t;
объявляется объединение tom, которое предполагает следующее расположение памяти (при использовании двухбайтовых целых).

Как и в классе, на отдельные переменные, составляющие объединение, можно ссылаться с помощью оператора "точка". Оператор "стрелка" используется для доступа к объединению с помощью указателя.

Применительно к объединениям существуют несколько ограничений. Объединение не может наследовать любые другие классы любого типа. Объединение не может быть базовым классом. Объединение не может иметь виртуальные функции-члены. Никакие члены не могут быть объявлены как статические. Объединение не может иметь в качестве члена объект, перегружающий оператор "равно" (=). Наконец ни какой объект не может быть членом объединения, если класс этого объекта явно определяет функцию конструктора или деструктора. (иначе говоря, приемлемы объекты, которые имеют только стандартные конструкторы и деструкторы.)

В языке C++ существует специальный тип объединения, называемый анонимным объединением. В анонимном объединении не содержится имени класса и не объявляются никакие объекты. Анонимное объединение просто уведомляет компилятор о том, что его переменные-члены должны иметь одну и туже область памяти. Однако к самим переменным можно обращаться напрямую, не прибегая к обычному синтаксису операторов "точка" и "стрелка".

union {
	int a;
	float f;
};

//...

a =10;	//доступ к переменной a
cout << f;	//доступ к переменной f
Анонимные объединения должны содержать только данные, никакие функции-члены не допускаются. Анонимное объединение, действующее в области видимости, определённой с заданным пространством имён (namespace), должно быть объявлено с использованием модификатора типа данных static.


Смотрите также

struct - структуры
enum - перечислимый тип
поля битов
typedef - создание нового имени




2018-04-22 15:15:36 Зачем?

Можете привести пример практического применения объединений? Или хотя бы прокомментировать мою версию. Допустим, мы объединим две схожие структуры, а использовать будем только одну, с вероятностью 50 на 50, но точно не знаем какая пригодится, то для экономии памяти можно будет воспользоваться таким способом. Найдутся ли другие примеры?

2018-05-04 14:40:10 для работы с битами

typedef unsigned char byte; union{ int a; byte b[4]; }

2018-05-20 07:01:28 Тимур

В SDL они используются для событий. Это хороший выбор, на мой взгляд. http://wiki.libsdl.org/SDL_WindowEvent

2018-05-20 07:02:31 Тимур

Ошибся ссылкой. http://wiki.libsdl.org/SDL_Event

2018-05-20 07:04:47 Тимур

Можно добавить в описание, что размер объединения определяется размером его максимального члена.




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: