×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 687 из 714 Настройки
или >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

Члены анонимного объединения непосредственно доступны в той области видимости, где определено анонимное объединение.

У анонимного объединения не может быть закрытых или защищенных членов, кроме того, оно не может определять функции-члены.

Объединения с членами типа класса

По прежним стандартам языка С++ у объединений не могло быть членов типа класса, которые определяли бы собственные конструкторы или функции-члены управления копированием. По новому стандарту это ограничение снято. Однако объединения с членами, способными определять собственные конструкторы и (или) функции-члены управления копированием, куда сложней в применении, чем объединения только с членами встроенного типа.

Если у объединения есть члены только встроенного типа, для изменения содержащегося в нем значения можно использовать обычное присвоение. С объединениями, у которых есть члены нетривиальных типов, все не так просто. При присвоении или замене значения члена объединения типа класса следует создать или удалить этот член соответственно: при присвоении объединению значения типа класса следует запустить конструктор для типа данного элемента, а при замене — запустить его деструктор.