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

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

C/C++ структури та класи

[ред. | ред. код]

Структура в 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.

Див. також

[ред. | ред. код]