Структури. Частина 1. Складені типи даних. Шаблон структури. Структурна змінна. Структури в середовищі CLR. Оголошення та ініціалізація структурної змінної
Зміст
- 1. Яка відмінність між базовими та складеними типами даних?
- 2. Які типи даних в C++ належать до сладених або агрегатних типів даних?
- 3. Що називається структурою в C++? Що називається полями структурної змінної?
- 4. Яким чином класифікуються структури в середовищі CLR? Native-структури. Managed-структури
- 5. Яка загальна форма оголошення native-структури (шаблону структури)?
- 6. Яка загальна форма оголошення managed-структури з кваліфікаторами ref та value?
- 7. Що таке шаблон (формат) структури? Приклади оголошення шаблону
- 8. Що таке структурна змінна? Способи оголошення структурних змінних. Доступ до полів структурної змінної
- 9. Де можна задавати шаблон структури у середовищі CLR?
- 10. Як здійснюється ініціалізація структурної змінної при її оголошенні? Приклад ініціалізації native-структурної змінної
- Зв’язані теми
Пошук на інших ресурсах:
1. Яка відмінність між базовими та складеними типами даних?
Усі типи даних в C++ поділяються на:
- базові типи даних;
- складені (агрегатні) типи даних.
Змінні базових типів даних складаються з одного елементу даних. Змінні складених типів даних містять два і більше елементів даних.
2. Які типи даних в C++ належать до сладених або агрегатних типів даних?
Складені типи даних ще називають агрегатними або конгломератними типами даних.
До складених або агрегатних типів даних належать:
- масиви;
- структури;
- об’єднання;
- зчислення (enumeration);
- класи.
3. Що називається структурою в C++? Що називається полями структурної змінної?
Структура – це об’єднання однієї або більше змінних в одній області пам’яті, яка має одне ім’я.
Структура – це об’єднання (групування) змінних, які є споріднені між собою за деяким критерієм.
Змінні, що входять в структуру називаються полями структури. Такі змінні можуть мати різні типи. Імена полів (змінних) в одному шаблоні мають бути унікальними. Однак, в різних шаблонах імена можуть повторюватись.
4. Яким чином класифікуються структури в середовищі CLR? Native-структури. Managed-структури
Середовище CLR підтримує оголошення структур двох видів:
- native-структури;
- managed-структури або керовані структури.
Native-структури – це класичні структури мови C/C++.
Managed-структури – це структури, які розміщуються в пам’яті, що виділяється і керується середовищем CLR.
Managed-структури можуть бути оголошені з одним з двох кваліфікаторів:
- кваліфікатор ref – означає, що структура є посилального типу;
- кваліфікатор value – означає, що структура є типом-значення.
Відмінність між кваліфікаторми ref і value полягає у способі виділення пам’яті для покажчика на структуру. Більш детально робота з покажчиками на managed-структури описана тут.
5. Яка загальна форма оголошення native-структури (шаблону структури)?
Для оголошення native-структури (або шаблону структури) використовується ключове слово struct. Загальна форма оголошення структури:
struct ім'я_типу_структури
{
тип елемент_1;
тип елемент_2;
...
тип елемент_N;
} структурні_змінні;
де
- ім’я_типу_структури – назва шаблону структури. Шаблон структури утворює новий тип даних, який може бути використаний у подальшому в програмі;
- тип – тип даних, що наявний на даний момент у програмі;
- елемент1, елемент2, …, елементN – назви елементів (змінних), що входять у структуру. Елементи структури ще називаються полями структури;
- структурні_змінні – це змінні, що є структурами. У випадку оголошення шаблону структури структурні_змінні можуть бути відсутніми (дивіться наступні пункти).
6. Яка загальна форма оголошення managed-структури з кваліфікаторами ref та value?
Загальна форма оголошення структури (шаблону структури) з кваліфікатором ref:
ref struct ім'я_типу_структури { тип елемент_1; тип елемент_2; ... тип елемент_N; } структурні_змінні;
Загальна форма оголошення структури (шаблону структури) з кваліфікатором value:
value struct ім'я_типу_структури { тип елемент_1; тип елемент_2; ... тип елемент_N; } структурні_змінні;
У вищенаведених описах:
- ім’я_типу_структури – назва шаблону структури. Шаблон структури утворює новий тип даних, який може бути використаний у подальшому в програмі;
- тип – тип даних, що наявний на даний момент у програмі;
- елемент1, елемент2, …, елементN – назви елементів (змінних), що входять у структуру. Елементи структури ще називаються полями структури;
- структурні_змінні – це змінні, що є структурами. У випадку оголошення шаблону структури структурні_змінні можуть бути відсутніми.
Більш детально робота з managed-структурами описана в темі:
7. Що таке шаблон (формат) структури? Приклади оголошення шаблону
Щоб описати структурну змінну, потрібно спочатку задати шаблон структури. Шаблон структури ще називається формат структури. При задаванні шаблону структури пам’ять не виділяється. Шаблон – це тільки опис (інформація), змінні яких типів мають входити в структуру.
Приклад 1. Опис шаблону структури, що описує інформацію про відроблені години працівником.
Шаблон містить наступну інформацію:
- код працівника;
- прізвище та ім’я працівника;
- кількість відроблених годин;
- розцінка за 1 годину.
// інформація про працівника // шаблон структури struct Worker { int code; // код працівника char name[50]; // ім'я працівника int hours; // кількість відроблених годин float cost; // розцінка за 1 годину };
У даному прикладі шаблон має ім’я Worker. У шаблоні описуються такі поля (змінні):
- code – код працівника;
- name – ім’я працівника;
- hours – кількість відроблених годин;
- cost – розцінка за 1 годину.
Приклад 2. Оголошення шаблону з іменем Laboratory, що містить інформацію про лабораторію в навчальному закладі:
- номер лабораторії;
- назва лабораторії;
- площа лабораторії;
- кількість посадкових місць.
// інформація про лабораторію // шаблон структури struct Laboratory { int number; char name; float area; int places; };
Для managed-структур перед словом struct вказується кваліфікатор ref або value.
8. Що таке структурна змінна? Способи оголошення структурних змінних. Доступ до полів структурної змінної
Структурна змінна – це змінна типу, що заданий в шаблоні структури. Якщо оголошується така змінна, то відбувається виділення пам’яті для неї. Структурна змінна ще називається екземпляром структури.
Структурну змінну можна оголосити декількома способами:
- на основі шаблону, який був оголошений раніше;
- під час оголошення шаблону;
- з допомогою кваліфікатора typedef.
Нижче наведено усі 3 способи оголошення структурної змінної, яка базується на основі шаблону Worker, який описує інформацію про працівника. Розглянуто приклад для native-структури.
// інформація про працівника // шаблон native-структури struct Worker { int code; // код працівника char name[50]; // ім'я працівника int hours; // кількість відроблених годин float cost; // розцінка за 1 годину };
Тоді структурну змінну можна оголосити такими способами.
Спосіб 1. Оголошення змінної на основі раніше заданого шаблону Worker. У цьому випадку спочатку задається шаблон структури, а потім оголошується змінна.
// Спосіб 1. Оголошення змінної на основі раніше створеного шаблону Worker w; // для змінної w виділяється пам'ять // заповнення полів змінної w.code = 334; strcpy(w.name, "Johnson B."); w.hours = 23; w.cost = 12.85f;
У вищенаведеному прикладі оголошується змінна з іменем w на основі раніше описаного шаблону Worker. Потім для прикладу заповнюються поля структурної змінної.
Спосіб 2. Оголошення змінної під час задавання шаблону. У цьому способі поєднується оголошення шаблону структури та створення екземпляру структури (змінної).
// Спосіб 2. Оголошення змінної w1 при оголошенні шаблону struct Worker { int code; // код працівника char name[50]; // ім'я працівника int hours; // кількість відроблених годин float cost; // розцінка за 1 годину } w1;
Доступ до полів змінної w1 з іншого програмного коду
// заповнення значеннями полів змінної w1 w1.code = 123; strcpy(w1.name, "Williams D."); w1.hours = 33; w1.cost = 10.58f;
Спосіб 3. Оголошення змінної на основі типу, створеного з допомогою кваліфікатора typedef.
Нехай в деякій частині програми оголошено новий тип WORKER, що базується на структурі Wrk, яка містить інформацію про працівника:
// ключове слово typedef // оголошення нового типу WORKER typedef struct Wrk { int code; char name[50]; int hours; float cost; } WORKER;
Тоді, щоб використати змінну з іменем w2 типу WORKER, можна написати такий код:
// оголошення змінної на основі типу, // заданого з допомогою ключового слова typedef WORKER w2; w2.code = 100; strcpy(w2.name, "Typedef"); w2.hours = 33; w2.cost = 21.33f;
У цьому способі задавати ім’я шаблону структури Wrk не є обов’язковим. Тобто, наступний запис також є коректний
// після слова struct назва шаблону відсутня typedef struct { int code; char name[50]; int hours; float cost; } WORKER;
9. Де можна задавати шаблон структури у середовищі CLR?
В середовищі CLR рекомендовано оголошувати шаблон структури або новий тип на базі структури (засіб typedef) в окремому “*.h” файлі, наприклад “MyStruct.h”. Тоді зручно підключати цю структуру в інші модулі програми, наприклад:
#include "MyStruct.h"
10. Як здійснюється ініціалізація структурної змінної при її оголошенні? Приклад ініціалізації native-структурної змінної
Нехай задано шаблон структури Worker
// шаблон native-структури struct Worker { int code; char name[50]; int hours; float cost; };
Тоді ініціалізація структурної змінної може бути такою.
Спосіб 1. Оголошення та ініціалізація змінної після того, як раніше було задано шаблон структури Worker
Worker w = { 150, "Andrews", 45, 18.45f }; int d; d = w.code; // d = 150 float f; f = w.cost; // f = 18.45
Спосіб 2. Об’єднання задавання шаблону, опису структурної змінної та її ініціалізації.
// шаблон структури struct Worker { int code; char name[50]; int hours; float cost; } w1 = { 200, "Armstrong W.", 64, 22.34f }; ... int d; float f; d = w1.code; // d = 200 f = w1.cost; // f = 22.34
Спосіб 3. Якщо задано тип з допомогою кваліфікатора typedef, тоді ініціалізація структурної змінної буде мати вигляд
// оголошення нового типу WORKER typedef struct { int code; char name[50]; int hours; float cost; } WORKER; ... WORKER W = { 333, "Baxter N.", 34, 15.30f }; int d; float f; d = W.code; // d = 333 f = W.cost; // f = 15.30f
Зв’язані теми
- Структури. Частина 2. Виділення пам’яті для структури. Вкладені структури. Масиви native-структур
- Структури. Частина 3. Робота з managed-структурами в середовищі CLR. Кваліфікатори ref і value. Оголошення структурних змінних. Масиви managed-структурних змінних. Ініціалізація managed-структур
- Структури. Частина 4. Структури і функції. Передача структури в функцію в середовищі CLR. Повернення структури з функції
- Функції. Частина 2. Функції і масиви. Передача одновимірного та багатовимірного масиву в функцію. Передача структури і класу в функцію
- Покажчики. Частина 3. Некеровані покажчики і масиви. Покажчик на структуру. Покажчик на клас
- Покажчики. Частина 6. Складені native та managed типи даних. Керовані покажчики (^) в середовищі CLR. Виділення пам’яті. Кваліфікатори ref та value. Керовані покажчики (^) на структури, класи