Программирование на C и C++

Онлайн справочник программиста на C и C++

Связь объединений и классов

Точно так же, как структуры и классы связаны между собой, связаны и объединения и классы. Объединения представляют по существу структуру, в которой все элементы хранятся в одном и том же месте. Объединения могут содержать конструкторы и деструкторы, а также функции-члены и дружественные функции. Подобно структурам, члены объединения по умолчанию имеют в качестве спецификатора доступа public. Например, следующая программа использует объедине­ние для вывода символов, соответствующих старшему и младшему байтам короткого целого (име­ющего размер в два байта как для 16-битных, так и для 32-битных сред):

#include <iostream.h>
union u_type {
u_type(short int a); // по умолчанию публичные
void showchars ();
short int i;
char ch[2];
};
// конструктор
u_type::u_type(short int a)
{
i = a;
}
// показ символов, которые содержит short int.
void u_type::showchars()
cout << ch [ 0 ] << " ";
cout << ch [ 1 ] << "\n";
int main()
u_type u(1000);
u.showchars ();
return 0;
}

Важно понимать, что подобно структуре, объявление объединения определяет тип класса. Это означает, что принципы инкапсуляции сохраняют свою силу.

Имеется несколько ограничений, которые необходимо иметь в виду при использовании объе­динений в С++. Первое — объединение не может наследовать какие-либо другие классы. Далее объединение не может использоваться в качестве базового класса. Объединение не может иметь виртуальные функции-члены. Никакие статичес­кие переменные не могут быть членами объединения. Объединение не может иметь в качестве члена какой-либо объект, перегружающий оператор =. Наконец, никакой объект не может быть членом объединения, если этот объект имеет конструктор или деструктор.