Объединение можно представить как структуру, все члены имеютнулевое смещения, а размер ее достаточно велик, чтобывмещать любой из ее членов. В любой момент времени объединениеможет содержать только один член. В объединении могут бытьфункции-члены (в том числе конструкторы и деструкторы), но невиртуальные функции ($$R.10.2). Объединение не может иметь базовыхклассов и не может само использоваться в качестве базового класса.Членом объединения не может быть объект класса с конструктором илидеструктором, а также с определенной пользователем операциейприсваивания ($$R.13.4.3). Объединение не может содержать статическихчленов, представляющих данные. Объединение вида union { список-членов } называется безымянным объединением, оно определяет объект без имени(и без типа). Имена всех членов безымянного объединения должныотличаться от других имен в той области видимости, в которой описанообъединение; их можно использовать в этой области видимостинепосредственно, без обычных операций доступа к членам ($$R.5.2.4).Приведем пример: void f() { union { int a; char* p; }; a = 1; //... p = "Jennifer"; //... } Здесь a и p используются как обычные переменные (не члены), но посколькуони входят в одно объединение, их адреса совпадают. Глобальные безымянные объединения можно описать со спецификациейstatic. Безымянные объединения не должны содержать частных илизащищенных членов ($$R.11), а также функций-членов. Если описаны объекты объединения или указатели на него, тооно не считается безымянным, например, union { int aa; char* p; } obj, *ptr=&obj; aa = 1; // ошибка ptr->aa = 1; // нормально Здесь присваивание простому имени aa незаконно, т.к. имя члена непривязано ни к какому объекту. Инициализация объединений, не имеющих конструкторов, описываетсяв $$R.8.4.1.