Составной тип данных
Эта статья нуждается в дополнительных цитатах для проверки . ( май 2016 г. ) |
В информатике составной тип данных или составной тип данных — это любой тип данных , который может быть создан в программе с использованием программирования языка примитивных типов данных и других составных типов. Иногда его называют структурным или агрегатным типом . [1] хотя последний термин может также относиться к массивам , спискам и т. д. Процесс построения составного типа известен как композиция . Составные типы данных часто противопоставляются скалярным типам данных .
Структуры и классы C/C++
[ редактировать ]А struct
— это в C и C++ понятие составного типа , типа данных, который составляет фиксированный набор помеченных полей или членов . Он назван так из-за struct
ключевое слово, используемое при их объявлении, которое является сокращением от структуры или, точнее, определяемой пользователем структуры данных . [ нужна ссылка ]
В C++ единственная разница между struct
а класс по умолчанию — это уровень доступа , который является частным для классов и общедоступным для struct
с.
Обратите внимание, что хотя классы и class
Ключевое слово было совершенно новым в C++, язык программирования C уже имел сырой тип struct
с. По сути, C++ struct
s образуют надмножество C struct
s: практически все действительные C struct
действительны C++ struct
s с той же семантикой.
Декларация
[ редактировать ]А 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
.
Другой пример: трехмерный составной тип Vector, использующий тип данных с плавающей запятой, можно создать с помощью:
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
предназначен для построения сложных типов данных, но иногда используется для создания примитивных структурных подтипов . Например, поскольку стандарт 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;
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Хау, Денис. «Бесплатный онлайн-словарь по информатике» . Foldoc.org . Проверено 6 февраля 2023 г.