Складений тип даних
В інформатиці складений тип даних — це будь-який тип даних, який можна сконструювати в програмі за допомогою примітивних типів даних мови програмування та інших складених типів. Іноді його називають структурним або агрегатним типом даних[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.