>double
.Имя объединения — это имя типа. Подобно встроенным типам, по умолчанию объединения не инициализированы. Объединение можно явно инициализировать таким же образом, как и агрегатные классы (см. раздел 7.5.5), — при помощи инициализаторов, заключенных в фигурные скобки:
>Token first_token = {'a'}; // инициализирует член cval
>Token last_token; // не инициализированный объект Token
>Token *pt = new Token; // указатель на не инициализированный
> // объект Token
Если инициализатор есть, он используется для инициализации первого члена. Следовательно, инициализация объединения >first_token
присваивает значение его члену >cval
.
К членам объекта типа объединения обращаются при помощи обычных операторов доступа к члену:
>last_token.cval = 'z';
>pt->ival = 42;
Присвоение значения переменной-члену объекта объединения делает другие его переменные-члены неопределенными. В результате при использовании объединения следует всегда знать, какое именно значение в настоящее время хранится в нем. В зависимости от типов членов возвращение или присвоение хранимого в объединении значения при помощи неправильной переменной-члена может привести к аварийному отказу или неправильному поведению программы.
Анонимное объединение (anonymous union) — это безымянное объединение, не содержащее объявлений между закрывающей фигурной скобкой, завершающей его тело, и точкой с запятой, завершающей определение объединения (см. раздел 2.6.1). При определении анонимного объединения компилятор автоматически создает безымянный объект только что определенного типа объединения:
>union { // анонимное объединение
> char cval;
> int ival;
> double dval;
>}; // определяет безымянный объект, к членам которого можно обращаться
> // непосредственно
>cval = 'c'; // присваивает новое значение безымянному, анонимному
> // объекту объединения
>ival = 42; // теперь этот объект содержит значение 42
Члены анонимного объединения непосредственно доступны в той области видимости, где определено анонимное объединение.
Если у объединения есть члены только встроенного типа, для изменения содержащегося в нем значения можно использовать обычное присвоение. С объединениями, у которых есть члены нетривиальных типов, все не так просто. При присвоении или замене значения члена объединения типа класса следует создать или удалить этот член соответственно: при присвоении объединению значения типа класса следует запустить конструктор для типа данного элемента, а при замене — запустить его деструктор.