- зміст
- 2. Як виглядає загальна форма оголошення типу (шаблону) об'єднання? Ключове слово union
- 3. Що таке довжина об'єднання? Як обчислюється довжина об'єднання?
- 4. Як оголосити тип (шаблон) об'єднання і змінну цього типу? приклад
- 5. Як здійснюється доступ до полів об'єднання?
- 6. Приклад оголошення і використання покажчика (*) на об'єднання
- 7. Як оголосити вкладені об'єднання (структури, класи) в шаблоні об'єднання? приклад
- 8. Як описати масив об'єднань? приклад
- 9. Які особливості застосування операції sizeof () для об'єднань і структур?
- пов'язані теми
зміст
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:
може займати в пам'яті 24 байта. Так як для масиву A виділяється 16 байт а не 10 байт. Компілятор додатково виділяє 6 байт щоб реалізувати вирівнювання на кордоні абзацу.
Таким чином, використання операції sizeof () для визначення типу структури або об'єднання гарантує переносність програмного коду.
⇑
пов'язані теми
⇑
2. Як виглядає загальна форма оголошення типу (шаблону) об'єднання?3. Що таке довжина об'єднання?
Як обчислюється довжина об'єднання?
4. Як оголосити тип (шаблон) об'єднання і змінну цього типу?
5. Як здійснюється доступ до полів об'єднання?
7. Як оголосити вкладені об'єднання (структури, класи) в шаблоні об'єднання?
8. Як описати масив об'єднань?
9. Які особливості застосування операції sizeof () для об'єднань і структур?
1. Що таке об'єднання в мові C ++?
Для чого використовуються об'єднання?