
Об'єднання.
Особливим видом структур даних є об'єднання. Визначення об'єднання нагадує визначення структури, лише замість ключового слова struct використовується union:
union number
{
short sx;
long lx;
double dx;
};
На відміну від структури, всі поля об'єднання розташовуються за однією адресою. Під об'єднання виділяється стільки пам'яті, скільки потрібно для зберігання найбільшого поля об'єднання. Об'єднання застосовуються в тих випадках, коли в один і той же момент часу використовується лише одне поле об'єднання і, перш за все, для економії пам'яті. Наприклад, нам потрібно визначити структуру, яка зберігає "універсальне" число, тобто число одного із зумовлених типів, і ознаку типа. Це можна зробити таким чином:
struct Value
{
enum NumberType {ShortType, LongType, DoubleType};
NumberType type;
short sx; // якщо type рівний ShortType
long lx; // якщо type рівний LongType
double dx; // якщо type рівний DoubleType
};
Поле type містить тип числа, що зберігається, а відповідне поле структури – значення числа.
Value shortVal;
shortVal.type = Value::ShortType;
shortVal.sx = 15;
Хоча пам'ять виділяється під всі три атрибути sx, lx і dx, реально використовується лише один з них. Зекономити пам'ять можна, використовуючи об'єднання:
struct Value
{
enum NumberType {ShortType, LongType, DoubleType};
NumberType type;
union number
{
short sx; // якщо type рівний ShortType
long lx; // якщо type рівний LongType
double dx; // якщо type рівний DoubleType
} val;
};
Тепер пам'ять виділена лише для максимального з цих трьох полів (в даному випадку dx). Проте і поводитися з об'єднанням треба обережно. Оскільки всі три поля ділять одну і ту ж область пам'яті, зміна одного з них означає зміну всіх інших. На малюнку пояснюється виділення пам'яті під об'єднання. У обох випадках ми передбачаємо, що структура розташована за адресою 1000. Об'єднання розташовує всі три своїх поля поодинці по однієй і тій же адресі.
Об'єднання існували в мові Сі, звідки без змін і перейшли в Си++. Використання спадкоємства класів, дозволяє у багатьох випадках добитися того ж ефекту без використання об'єднань, причому програма буде надійнішою.