Структуры (struct)
В отличие от массива, все элементы которого однотипны, структура может содержать элементы разных типов. В языке C++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры так, как они определены в языке C:
struct [имя_типа] { тип_1 элемент_1; тип_2 элемент_2; … тип_n элемент_n; } [список_описателей]; |
Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка:
// Определение массива структур и указателя на структуру; struct { char fio[30]; int date, code; double salary; } Staff [100]. *ps; |
Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами, например:
struct Worker //описание нового типа Worker { char fio[30]; int date, code; double salary; } // описание заканчивается точкой с запятой // определение массива типа Worker и указателя на тип Worker; Worker staff[100]. *ps; |
Имя структуры можно использовать сразу после его объявления (определение можно дать позднее) в тех случаях, когда компилятору не требуется знать размер структуры, например:
struct List; // объявление структуры List struct Link{ List *p; // указатель на структуру List Link *prev. *succ; // указатели на структуру Link }: struct List {/* определение структуры List */} |
Это позволяет создавать связные списки структур.
Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:
struct { char fio[30]; int date, code; double salary; } worker = {"Страусенко". 31. 215. 3400.55}; |
При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива (учитывая, что многомерный массив — это массив массивов):
struct complex { float real im; } compl [2][3] = { {{1. 1}. {1. 1}. {1. 1}} // строка 1. то есть массив compl [0] {{2. 2}. {2. 2}. {2. 2}} // строка 2. то есть массив compl [1] }: |
Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции. Другие операции со структурами могут быть определены пользователем. Размер структуры не обязательно равен сумме размеров ее элементов, поскольку они могут быть выровнены по границам слова.
Доступ к полям структуры выполняется с помощью операций выбора. (точка) при обращении к полю через имя структуры и -> при обращении через указатель, например:
worker worker staff [100] *ps; … worker.fio = "Страусенко"; staff[8].code = 215; ps->salary = 0.12; |
Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора:
struct А {int а; double х;}; struct В {А а: double х;}; х[2]; х[0].а.а = 1; х[1].х = 0.1; |
Как видно из примера, поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости. Более того, можно объявлять в одной области видимости структуру и другой объект (например, переменную или массив) с одинаковыми именами, если при определении структурной переменной использовать слово struct, но не советую это делать — запутать компилятор труднее, чем себя.
