В інформатиці складений тип даних — це будь-який тип даних, який можна сконструювати в програмі за допомогою примітивних типів даних мови програмування та інших складених типів. Іноді його називають структурним або агрегатним типом даних, хоча останній термін може також стосуватися масивів, списків тощо. Акт побудови складеного типу відомий як композиція. Складені типи даних часто протиставляються скалярним змінним.
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;
Примітки
Див. також Композиція (програмування) Скаляр struct (мова програмування C)