В информатике , составной тип данных или соединение типа данных является любым типом данных , которые могут быть построены в программе с использованием языка программирования «S примитивных типов данных и другие составными типов. Это иногда называют структурой или совокупностями типов данных , [1] хотя последний термин может также относиться к массивам , спискам и т.д. акт построения составного типа известен как композиция . Составные типы данных часто противопоставляются скалярным переменным .
Структуры и классы C / C ++
A struct
- это представление C и C ++ о составном типе, типе данных, который составляет фиксированный набор помеченных полей или членов . Он так называется из-за struct
ключевого слова, используемого при их объявлении, которое является сокращением от структуры или, точнее, определяемой пользователем структуры данных . [ необходима цитата ]
В C ++ единственная разница между a struct
и классом - это уровень доступа по умолчанию , который является частным для классов и общедоступным для struct
s.
Обратите внимание, что, хотя классы и class
ключевое слово были совершенно новыми в C ++, язык программирования C уже имел грубый тип struct
s. Во всех смыслах и целях C ++ struct
образуют надмножество C struct
: практически все допустимые C struct
являются действительными C ++ struct
с той же семантикой.
Декларация
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 красный ; беззнаковый int зеленый ; беззнаковый int синий ; };
В трехмерной графике вы обычно должны отслеживать положение и цвет каждой вершины. Один из способов сделать это - создать Vertex
составной тип, используя ранее созданные Vector
и Color
составные типы:
struct Vertex { положение вектора ; Цвет цвет ; };
Создание
Создайте переменную типа, struct Vertex
используя тот же формат, что и раньше:Vertex v;
Доступ для членов
Присвойте значения компонентам v
:
v . положение . х = 0,0 ; v . положение . у = 1,5 ; v . положение . z = 0,0 ; v . цвет . красный = 128 ; v . цвет . зеленый = 0 ; v . цвет . синий = 255 ;
Примитивный подтип
В основном он используется struct
для создания сложных типов данных, но иногда он используется для создания примитивных структурных подтипов . Например, поскольку Стандарт C [ необходима ссылка ] требует, чтобы если две структуры имели одинаковые начальные поля, эти поля были бы представлены одинаково, код
struct ifoo_old_stub { длинные х , у ; }; struct ifoo_version_42 { длинные х , у , г ; char * имя ; длинные а , б , в ; }; недействительна 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 { Центр точки ; двойной радиус ; Метрическая метрика ; } Круг ;
Смотрите также
Рекомендации
- ^ Хау, Денис. «Бесплатный он-лайн словарь по вычислительной технике» . Dictionary.com . Проверено 1 февраля +2016 . CS1 maint: обескураженный параметр ( ссылка )