Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 8.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
34 Кб
Скачать
☆

Структуры (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, но не советую это делать — запутать компилятор труд­нее, чем себя.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]