Складений тип даних
В інформатиці складений тип даних — це будь-який тип даних, який можна сконструювати в програмі за допомогою примітивних типів даних мови програмування та інших складених типів. Іноді його називають структурним або агрегатним типом даних[1], хоча останній термін може також стосуватися масивів, списків тощо. Акт побудови складеного типу відомий як композиція. Складені типи даних часто протиставляються скалярним змінним.
Структура в 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;
- ↑ Howe, Denis. The Free On-line Dictionary of Computing. Dictionary.com (англ.). Процитовано 1 лютого 2016.