Справочник по 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 - создание нового имени


Реклама