В информатике, композит Тип данных или составной тип данных - это любой тип данных, который может быть построен в программе с использованием примитивных данных языка программирования языка. типы и другие составные типы. Иногда его называют структурой или типом агрегированных данных, хотя последний термин может также относиться к массивам, спискам и т. Д. акт построения составного типа известен как композиция. Составные типы данных часто противопоставляются скалярным переменным.
A struct
- это C и C ++ s понятие составного типа, типа данных, который составляет фиксированный набор помеченных полей или элементов . Он вызван так из-за ключевого слова struct
, используемого при их объявлении, которое является сокращением от структуры или, точнее, определяемой пользователем структуры данных.
В C ++ единственная разница между struct
и class - это уровень доступа по умолчанию, который является частным для классов и общедоступным для struct
s.
Обратите внимание, что хотя классы и class
ключевое слово были совершенно новыми в C ++, язык программирования C уже имел грубый тип struct
s. Для всех намерений и целей C ++ struct
образуют надмножество из C struct
s: практически все действительные структуры C struct
являются действительными C ++ struct
с той же семантикой.
A Объявление struct
состоит из списка полей, каждое из которых может иметь любой тип. Общий объем хранилища, необходимый для объекта struct
, представляет собой сумму требований к хранилищу всех полей плюс любые внутренние заполнение.
. Например:
struct Account {int account_number; char * first_name; char * last_name; плавающий баланс; };
определяет тип, обозначенный как 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; плавающий баланс; } Счет;
В коде 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 зеленый; беззнаковый int синий; };
В трехмерной графике вы обычно должны отслеживать положение и цвет каждой вершины. Один из способов сделать это - создать составной тип Vertex
, используя ранее созданные составные типы Vector
и Color
:
struct Vertex {Vector position ; Цвет цвет; };
Создайте переменную типа 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 {длинные x, y, z; название символа; длинные а, б, в; }; недействительна operation_on_ifoo (struct ifoo_old_stub *); struct ifoo_version_42 s;... operation_on_ifoo (s);
будет работать правильно.
Сигнатура типа (или Типы функций ) конструируются из примитивных и составных типов и сами могут служить типами при создании составных типов:
typedef struct {int x; int y; } Point; typedef double (* Metric) (точка p1, точка p2); typedef struct {Центр точки; двойной радиус; Метрическая метрика; } Круг;