Структуры
Прежде чем говорить о структурах, вспомним массивы. Как вы, наверное, помните, массивы предназначены для хранения однотипных данных. Другими словами, каждый элемент массива представляет собой значение
определенного типа: целое число, символ, строка. Но зачастую, в программах, требуется хранить в одном месте
данные разных типов.
В качестве примера рассмотрим программу которая хранит список книг в библиотеке. Про каждую книгу нам известно: название, автор, год издания, количество экземпляров, стоимость книги.
Типы переменных, используемые для хранения подобных данных необходимо взять такие:
string
– название, автор
int
– год издания, количество экземпляров
float
– стоимость книги.
Возможная реализация представляется таким образом: завести для каждого отдельного качества отдельный массив. Например:
string author[100]; // автор
string title[100]; // название
int year[100]; // год издания
int count[100]; // количество экземпляров
float price[100]; //стоимость
Теперь для того, чтобы вывести информацию о какой-либо книге, мы можем обратиться по
i
-му номеру к соответствующему элементу массиву.
Например,
cout << author[3] << ". " << title[3] << ". " << year[3] << " year";
Теперь представим, что нам надо отсортировать список книг в определенном порядке. Как поступить? Реализация сортировки будет достаточно сложной. Описывая таким образом данные, мы получили 5 массивов, которая логически между собой не связаны. Придется постоянно при сортировке сортировать сразу все массивы. Достаточно неудобно и есть вероятность забыть про что-то.
Хочется, чтобы все эти массивы были объединены в один какой-то блок, с которым можно было бы работать как с единым объектом.
Для таких целей и служат
структуры.
Структура - это тип данных, предназначенный для объединения данных различных типов в единое целое. Структура может включать в себя несколько полей - элементов разных типов (в том числе и другие структуры).
Давайте попробуем нашу информацию описать в виде структуры.
Прежде чем использовать структуру (как и любую другую переменную) ее нужно объявить (описать внутреннюю структуру, можно назвать это шаблоном).
Описание структуры
struct /* имя_структуры */ {
/* переменные-члены структуры */
};
Таким образом, мы можем под одним именем объединить самые разные данные. Это могут быть простые типы данных или даже массивы. Причем сама структура может также
быть и массивом. Тогда она будет называться
массив-структур.
Имя структуры фактически является новым типом данных, который мы можем использовать в программе, также как и любой другой тип. Обычно
структуры описываются сразу после подключения заголовочных файлов. Иногда, для удобства, описание структур выносят в отдельный заголовочный файл.
Возвращаясь к нашему примеру, опишем структуру
book
с полями
author
,
title
,
year
,
count
,
price
соответствующих типов.
struct book
{
string author; // автор
string title; // название
int year; // год издания
int count; // количество экземпляров
float price; //стоимость
};
В качестве полей структуры могут выступать любые встроенные типы данных и даже другие структуры.
На имена полей накладываются те же ограничения, что и на обычные переменные. Внутри одной структуры не должно быть полей с одинаковыми именами.
Для обращения к отдельным полям структуры используют так называемую
точечную запись, разделяя точкой имя структуры и имя поля.
Например,
b.author
обозначает "
поле author структуры b
"
C полями структуры можно обращаться также, как и с обычными переменными соответствующего типа. Можно вводить значения полей с клавиатуры, выводить значения на экран, присваивать значения. То есть работать как с обычной переменной.
Например,
getline(cin, b.author);
getline(cin, b.title);
cin >> b.count;