Складений тип даних

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

В інформатиці складений тип даних — це будь-який тип даних, який можна сконструювати в програмі за допомогою примітивних типів даних мови програмування та інших складених типів. Іноді його називають структурним або агрегатним типом даних[1], хоча останній термін може також стосуватися масивів, списків тощо. Акт побудови складеного типу відомий як композиція. Складені типи даних часто протиставляються скалярним змінним.

C/C++ структури та класи[ред. | ред. код]

struct — це поняття C і C++ про складений тип, тип даних, який складається з фіксованого набору позначених полів або членів. Це називається так через ключове слово struct, яке використовується під час їх оголошень, що є скороченням від структури або, точніше, визначеної користувачем структури даних.

У C++ єдиною відмінністю між struct та класом є рівень доступу за замовчуванням, який є приватним для класів і публічним для struct.

Зауважте, що хоча класи та ключове слово class були абсолютно новими в C++, мова програмування C вже мала необроблений тип struct. Для всіх намірів і цілей структури C++ утворюють надмножину структур C: практично всі дійсні struct C є дійсними struct C++ з однаковою семантикою.

Оголошення[ред. | ред. код]

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

Наприклад:

struct Account {
  int account_number;
  char *first_name;
  char *last_name;
  float balance;
};

визначає тип, який називається struct Account. Щоб створити нову змінну цього типу, ми можемо написати struct Account myAccount; який має цілочисельний компонент, до якого myAccount.account_number, і компонент з рухомою комою, до якого отримує доступ myAccount.balance, а також компоненти first_name і last_name. Структура myAccount містить усі чотири значення, і всі чотири поля можна змінювати незалежно.

Оскільки багаторазове написання struct Account у коді стає громіздким, нерідко можна побачити оператор typedef у коді C, щоб забезпечити більш зручний синонім для struct. Проте деякі інструкції зі стилю програмування не рекомендують цього, стверджуючи, що це може заплутати тип.

Наприклад:

typedef struct Account_ {
  int  account_number;
  char  *first_name;
  char  *last_name;
  float balance;
} Account;

У коді C++ typedef не потрібен, оскільки типи, визначені за допомогою struct, уже є частиною звичайного простору імен, тому тип можна називати або struct Account або просто Account. Як інший приклад, тривимірний векторний складений тип, який використовує тип даних з рухомою комою, можна створити за допомогою:

struct Vector {
 float x;
 float y;
 float z;
};

Змінна з іменемvelocity зі складеним типом Vector буде оголошена як Vector velocity; Доступ до членів velocity можна отримати за допомогою крапкової нотації. Наприклад, velocity.x = 5; встановить компонент x velocity рівним 5. Подібно колірна структура може бути створена за допомогою:

struct Color {
 unsigned int red;
 unsigned int green;
 unsigned int blue;
};

У 3D-графіці зазвичай потрібно стежити за положенням і кольором кожної вершини. Одним із способів зробити це було б створити складений тип Vertex, використовуючи раніше створені складені типи Vector і Color :

struct Vertex {
 Vector position;
 Color color;
};

Інстанціювання[ред. | ред. код]

Створіть змінну типу struct Vertex, використовуючи той самий формат, що й раніше: Vertex v;

Членський доступ[ред. | ред. код]

Присвойте значення компонентам v так:

v.position.x = 0.0;
v.position.y = 1.5;
v.position.z = 0.0;
v.color.red = 128;
v.color.green = 0;
v.color.blue = 255;

Примітивний підтип[ред. | ред. код]

Основне використання struct — це створення складних типів даних, але іноді його використовують для створення примітивних структурних підтипів. Наприклад, починаючи зі стандарту ANSI C мова вимагає, щоб, якщо дві структури мають однакові початкові поля, ці поля були представлені однаково. Код:

struct ifoo_old_stub {
  long x, y;
};
struct ifoo_version_42 {
  long x, y, z;
  char *name;
  long a, b, c;
};
void operate_on_ifoo(struct ifoo_old_stub *);
struct ifoo_version_42 s;
. . .
operate_on_ifoo(&s);

буде працювати правильно.

Тип підпису[ред. | ред. код]

Сигнатури типів (або функційні типи) створюються з примітивних і складених типів, і можуть самі служити типами під час створення складених типів:

typedef struct {
  int x;
  int y;
} Point;

typedef double (*Metric) (Point p1, Point p2);

typedef struct {
  Point centre;
  double radius;
  Metric metric;
} Circle;

Примітки[ред. | ред. код]

  1. Howe, Denis. The Free On-line Dictionary of Computing. Dictionary.com (англ.). Процитовано 1 лютого 2016.

Див. також[ред. | ред. код]