Объеденения

Объеденения — это тип класса, в котором все данные разделяют одну и туже область памяти. В языке 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 - создание нового имени