Донецкий техникум промышленной автоматики

C ++. Об'єднання. Ключове слово union. приклади коду

  1. зміст
  2. 2. Як виглядає загальна форма оголошення типу (шаблону) об'єднання? Ключове слово union
  3. 3. Що таке довжина об'єднання? Як обчислюється довжина об'єднання?
  4. 4. Як оголосити тип (шаблон) об'єднання і змінну цього типу? приклад
  5. 5. Як здійснюється доступ до полів об'єднання?
  6. 6. Приклад оголошення і використання покажчика (*) на об'єднання
  7. 7. Як оголосити вкладені об'єднання (структури, класи) в шаблоні об'єднання? приклад
  8. 8. Як описати масив об'єднань? приклад
  9. 9. Які особливості застосування операції sizeof () для об'єднань і структур?
  10. пов'язані теми

зміст

1. Що таке об'єднання в мові C ++? Для чого використовуються об'єднання?

Об'єднання - це групування змінних, які поділяють одну і ту ж область пам'яті. Залежно від інтерпретації здійснюється звернення до тієї чи іншої змінної об'єднання. Всі змінні, що включені в об'єднання починаються з одного кордону.

Об'єднання дозволяє представити в компактному вигляді дані, які можуть змінюватися. Одні і ті ж дані можуть бути представлені різними способами за допомогою об'єднань.

Точно також як і структури , Об'єднання вимагають оголошення типу (шаблону) і оголошення змінної цього типу.

2. Як виглядає загальна форма оголошення типу (шаблону) об'єднання? Ключове слово union

Оголошення об'єднання (типу об'єднання або шаблону об'єднання) починається з ключового слова union.

union імя_тіпа_об'едіненія {тип переменная1; тип переменная2; ... тип змінна N; };

де

  • імя_тіпа_об'едіненія - безпосередньо ім'я новоствореного типу;
  • переменная1, переменная2, змінна N - змінні, які є полями об'єднання. Ці змінні можуть бути різних типів;
  • тип - тип змінної, який є полем об'єднання.

Тип змінної може бути:

3. Що таке довжина об'єднання? Як обчислюється довжина об'єднання?

Довжина об'єднання - це розмір пам'яті в байтах, яка виділяється для однієї змінної цього типу об'єднання.

Довжина об'єднання обчислюється як максимум з усіх довжин (розмірів в байтах) окремих полів шаблону. Слід нагадати, що одне поле - це оголошення однієї змінної в об'єднанні (див. П. 2).

4. Як оголосити тип (шаблон) об'єднання і змінну цього типу? приклад

Нехай заданий тип об'єднання, яке містить змінні типів з плаваючою точкою

// оголошення типу "об'єднання Floats" union Floats {float f; // розглядається 4 байта double d; // розглядається 8 байт};

Тип об'єднання Floats містить 2 змінні з іменами f і d. Мінлива f є типу float, змінна d є типу double. Для змінної f типу float розглядається (береться до уваги) 4 байта. Для змінної d типу double береться до уваги 8 байт, так як компілятор виділяє для цього типу саме 8 байт.

Щоб використовувати об'єднання Floats в іншому програмному коді (методі, обробнику події і т.п.) потрібно оголосити змінну типу Floats як показано нижче

Floats Fl; int d; Fl.f = 20.5; // Fl.d не визначене Fl.d = -100.35; // тепер Fl.f не визначене d = sizeof (Fl); // d = 8

Оскільки розміщення змінних у пам'яті умовно починається з однієї адреси, то для змінної Fl типу Floats виділяється 8 байт пам'яті. Це пов'язано з тим, що змінна типу double вимагає більше пам'яті для свого представлення ніж змінна типу float.

На малюнку 1 відображено розміщення (інтерпретація) змінних f, d з об'єднання Floats.

Мал. 1. Подання змінних f, d в об'єднанні Floats

5. Як здійснюється доступ до полів об'єднання?

Доступ до полів об'єднання здійснюється так само, як і для структури:

  • за допомогою символу '. ';
  • за допомогою послідовності символів '->' в разі, коли оголошена змінна-вказівник на об'єднання.

6. Приклад оголошення і використання покажчика (*) на об'єднання

Робота об'єднань з некерованими (*) покажчиками точно така ж, як і робота структур з некерованими покажчиками .

У наступному прикладі оголошується некерований покажчик на об'єднання типу Ints

// покажчик на об'єднання Ints * p; // некерований покажчик // виділити пам'ять для об'єднання p = new Ints; // доступ до полів за допомогою покажчика pI-> a = 200; pI-> b = 3400;

7. Як оголосити вкладені об'єднання (структури, класи) в шаблоні об'єднання? приклад

Шаблон об'єднання може включати поля, що є структурами, об'єднаннями та класами.

У прикладі нижче оголошується шаблон об'єднання з ім'ям Types, що містить два вкладених об'єднання Floats і Ints, структуру ArrayOfChars і клас MyPoint.

Оголошення структур і об'єднань має такий вигляд

// об'єднання цілочисельних типів union Ints {unsigned short int a; unsigned int b; unsigned long int c; }; // структура, що містить 2 рядки struct ArrayOfChars {char A [10]; char B [8]; }; // оголошення типу "об'єднання Floats" union Floats {float f; // розглядається 4 байта double d; // розглядається 8 байт};

Оголошення шаблону класу має такий вигляд:

// клас оголошується в окремому модулі, наприклад MyPoint.h #pragma once class MyPoint {public: int x; int y; // методи класу int GetX (void) {return x; } Int GetY (void) {return y; } Void SetXY (int nx, int ny) {x = nx; y = ny; }};

Оголошення типу об'єднання Types з вкладеними складними типами Ints, Floats, ArrayOfChars, MyPoint.

// підключити модуль з оголошеним класом MyPoint #include "MyPoint.h" ... // оголошення типу "об'єднання Types" union Types {Floats Fl; // об'єднання Ints I; // об'єднання ArrayOfChars A; // структура MyPoint MP; // клас};

Використання об'єднання Types в деякому програмному коді:

// оголосити змінну типу "об'єднання Types" Types T; // змінити значення полів змінної T T.Fl.f = (float) 20.35; // об'єднання Floats TIb = 230; // об'єднання Ints TAA [2] = 'A'; // структура ArrayOfChars T.MP.SetXY (3,8); // клас MyPoint int d; d = T.MP.GetX (); // d = 3

8. Як описати масив об'єднань? приклад
// Приклад оголошення і використання масиву об'єднань Floats F [5]; // оголошується масив з 5 об'єднань типу Floats // заповнення значень полів for (int i = 0; i <5; i ++) {F [i] .d = i * 0.2 + i * i; }

9. Які особливості застосування операції sizeof () для об'єднань і структур?

У програмах на C ++ для визначення розміру змінної типу «структура» або «об'єднання» обов'язково потрібно використовувати операцію sizeof. Визначення розміру «вручну» є помилковим оскільки:

  • розміри деяких вбудованих типів (наприклад тип int) можуть бути різними для різних комп'ютерів. Наприклад, на одних платформах для типу int буде виділено 2 байта, на інших 4 байта;
  • компілятор робить так зване «вирівнювання пам'яті» на кордоні слова (2 байта) або абзацу (16 байт). Наприклад, якщо компілятор робить вирівнювання на кордоні абзацу, то структура (об'єднання) типу ArraysOfChars:
// структура, що містить 2 рядки struct ArrayOfChars {char A [10]; char B [8]; };

може займати в пам'яті 24 байта. Так як для масиву A виділяється 16 байт а не 10 байт. Компілятор додатково виділяє 6 байт щоб реалізувати вирівнювання на кордоні абзацу.

Таким чином, використання операції sizeof () для визначення типу структури або об'єднання гарантує переносність програмного коду.

пов'язані теми

2. Як виглядає загальна форма оголошення типу (шаблону) об'єднання?
3. Що таке довжина об'єднання?
Як обчислюється довжина об'єднання?
4. Як оголосити тип (шаблон) об'єднання і змінну цього типу?
5. Як здійснюється доступ до полів об'єднання?
7. Як оголосити вкладені об'єднання (структури, класи) в шаблоні об'єднання?
8. Як описати масив об'єднань?
9. Які особливості застосування операції sizeof () для об'єднань і структур?
1. Що таке об'єднання в мові C ++?
Для чого використовуються об'єднання?