Структури. Частина 1. Складені типи даних. Шаблон структури. Структурна змінна. Структури в середовищі CLR. Оголошення та ініціалізація структурної змінної

Структури. Частина 1. Складені типи даних. Шаблон структури. Структурна змінна. Структури в середовищі CLR. Оголошення та ініціалізація структурної змінної


Зміст


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


Зв’язані теми