Найти в Дзене
easystuding

С++ | структуры (struct) | определение структур

Оглавление

Формат определения структуры:

Структуры представляют собой группы связанных между собой, как правило, разнотипных переменных, объединенных в единый объект, в отличие от массива, все элементы которого однотипны. В языке C++ структура является видом класса и обладает всеми его свойствами.

Для определения структуры применяется ключевое слово struct, а сам формат определения выглядит следующим образом:

struct [имя_типа] {
тип_1 элемент_1; тип _2 элемент_2; …
тип_k элемент_k; } [ список_описателей ];

Каждая входящая в структуру переменная называется членом (полем, элементом) структуры и описывается типом данных и именем. Поля структуры могут быть любого типа данных. Их количество не лимитировано.

Использование структур:

После определения структуры можно её использовать. Для начала можно определить объект структуры - по сути обычную переменную, которая будет представлять описанную ранее структуру.

struct Student Ivan;

Здесь определена переменная Ivan, которая представляет структуру Student.

При описании структуры память для размещения данных не выделяется. Работать с описанной структурой можно только после того, как будет определена переменная (переменные) этого типа данных, только при этом компилятор выделит необходимую память.

Еще один способ определения структуры представляет ключевое слово typedef:

typedef struct
{ int age;
char name[10];
} person;

В конце определения структуры после закрывающей фигурной скобки идет ее обозначение - в данном случае person. В дальнейшем можно использовать это обозначение для создания переменной структуры.

person tom = {23, "Tom"};

В языке С++ отличие от С при определении переменной не нужно использовать слово struct.

Инициализация структур:

Инициализация структур аналогична инициализации массивов: в фигурных скобках передаются значения для элементов структуры по порядку. Так как в структуре student первым определено свойство, которое представляет тип int - число, то в фигурных скобках вначале идет число. И так далее для всех элементов структуры по порядку.

При определении переменной структуры ее можно сразу инициализировать, присвоив какое-нибудь значение:

struct student Ivan = {23, "Ivan", 0393};

Инициализировать структуру можно сразу после её объявления. Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:

struct complex{
float real, im;
} data [2][2] = {
{{1,1}, {2,2}}, {{3,3}, {4,4}} };

Все поля структурных переменных располагаются в непрерывной области памяти одно за другим. Общий объем памяти, занимаемый структурой, равен сумме размеров всех полей структуры. Для определения размера структуры следует использовать инструкцию sizeof().

Структуры как элемент структур:

Кроме базовых примитивных типов данных как int или char, массивов и указателей в качестве элементов структуры можно использовать другие структуры.

struct Pizza
{
char name[20];
int price;
};

struct Client
{
char name[20];
char phone[20];
};

struct Order
{
struct Client client;
int count;
struct Pizza pizza;
};

Использованные здесь структуры отражают объекты реального мира. Структура Order представляет некоторого клиента, его элементы client, count и pizza представляют клиента-заказчика (структура client), количество заданных пицц и заказанную пиццу (структура pizza) соответственно. Структура Pizza представляет собой пиццу, в которой определено три элемента: name - название, price - стоимость. Структура Client содержит информацию о клиенте-заказчике, его имя name и номер телефона phone.

Таким образом, получается, что структура Order имеет три элемента, но так клиент и пицца - составные элементы и сами содержат по два элемента, то при инициализации структуры order нужно передать 5 параметров:

Order order_1 = {"Ivan", "+7 (111) 272-65-52", 2, "Hawaiian", 280};

Передача значений таким образом идет в том порядке, в котором элементы определены в структуре, в том числе во вложенных структурах.

Массивы структур:

В программировании очень часто используются такие конструкции, как массивы структур. Все форматы определения массива структур будут аналогичны определению массивов других типов:

struct Students students[30];

Был определен 30-элементный массив, каждый элемент которого предназначен для хранения данных одного студента. Получение доступа к данным некоторого студента из группы N осуществляется обычной индексацией переменной массива. Поскольку поля структуры могут быть любого типа данных, то они в свою очередь могут быть другой структурой или массивом других структур:

struct Stud
{
char FN[100];
short listNumber;
};

struct Group {
int groupNumber;
short students;
Stud stud[30];
};

Но в структуре поля нельзя использовать элемент, тип которого совпадает с типом самой структуры, так как рекурсивное использование структур запрещено.

Ещё один пример использования массива структур:

struct person
{ int age;
char name[20];
};

int main(void)
{
struct person people[] = {23, "Tom", 32, "Bob", 26, "Alice", 41, "Sam"};
return 0;
}

В массиве people определено 4 объекта person. Хотя при инициализации в массив передается 8 значений {23, "Tom", 32, "Bob", 26, "Alice", 41, "Sam"}, но так как каждая структура состоит из двух элементов, то соответственно из этих значений по порядку получается 4 объекта person.

Доступ к полям структур:


Для того чтобы записать данные в структурную переменную, необходимо каждому полю структуры присвоить определенное значение. Для этого необходимо использовать оператор ‘
.’ («точка»):

struct Stack { // Cтек float arr[100];
short topIndex;
};

Stack stack; // Объявляем переменную типа Stack Stack.arr[0] = 1;

При доступе к определенному полю его следует рассматривать как обычную переменную, тип данных которой соответствует типу этого поля. Поля структур могут участвовать в качестве операндов любых выражений, допускающих использование операндов соответствующего типа данных.

Копирование данных из одной структурной переменной в другую осуществляется простой операцией присваивания, независимо от количества полей и размера структуры (это можно делать только в том случае, когда обе переменные одного и того же типа).

struct company
{ char name[20];
char country[30];
};
struct smartphone
{ char title[20];
int price;
struct company manufacturer; };

int main(void)
{
struct smartphone phone = {"iPhone 8", 56000, "Apple", "USA"};

std::cout << phone.title;
std::cout << phone.price;
std::cout << phone.manufacturer.name;

return 0;
}