В предыдущих статьях мы рассматривали только переменные. Переменные стандартных типов, таких, как float, char и int, способны представлять какую-либо одну величину – высоту, сумму, значение счетчика и т. д. Однако иногда отдельные переменные бывает удобно объединять в более сложные конструкции. В реальной жизни мы совершаем подобные действия, когда организуем работников фирмы в отделы или составляем предложения из отдельных слов. В C++ одной из конструкций, реализующих объединение разнородных данных, является структура.
Структура является объединением простых переменных. Эти переменные могут иметь различные типы: int, float и т. д. (именно разнородностью типов переменных структуры отличаются от массивов, в которых все переменные должны иметь одинаковый тип). Переменные, входящие в состав структуры, называются полями структуры.
Для тех, кто изучает язык C++, структуры являются одной из составляющих главных концепций языка – объектов и классов. На самом деле синтаксис структуры фактически идентичен синтаксису класса. На практике отличие структуры от класса заключается в следующем: структуры в языке С++, как правило, используют в качестве объединения данных, а классы — в качестве объединения данных и функций. Таким образом, изучая структуры в языке С++, мы тем самым закладываем основы для понимания классов и объектов.
Простая структура
Мы начнем рассмотрение со структуры, содержащей три поля, два из которых имеют целый тип и одно поле – вещественный тип. Эта структура предназначена для хранения информации о комплектующих деталях изделий, выпускаемых фабрикой. Компания производит несколько типов изделий, поэтому номер модели изделия включен в структуру как первое из полей. Номер самой детали представлен вторым полем, а ее стоимость – последним, третьим полем.
В программе PARTS определяется структура part и переменная part1 типа part. Затем полям переменной part присваиваются значения и выводятся на экран.
// parts.срр - структура для хранения информации о деталях изделий #include "iostream" using namespace std; struct part // объявление структуры { int modelnumber; // номер модели изделия int partnumber; // номер детали float cost; // стоимость детали }; void main() { part part1; // определение структурной переменной part1.modelnumber = 6244; // инициализация полей part1.partnumber = 373; // переменной part1 part1.cost = 217.55F; // вывод значений полей на экран cout << "Модель " << part1.modelnumber; cout << ", деталь " << part1.partnumber; cout << ", стоимость $" << part1.cost << endl; }
Результат работы программы выглядит следующим образом:
Модель 6244, деталь 373, цена $217.55
В программе PARTS присутствуют три основных аспекта работы со структурами: определение структуры, определение переменной типа этой структуры и доступ к полям структуры. Рассмотрим каждый из этих аспектов.
Определение структуры
Определение структуры в языке С++ задает ее внутреннюю организацию, описывая поля, входящие в состав структуры:
struct part { int modelnumber; int partnumber; float cost; };
Синтаксис определения структуры
Определение структуры в языке С++ начинается с ключевого слова struct. Затем следует имя структуры, в данном случае этим именем является part. Объявления полей структуры modelnumber, partnumber и cost заключены в фигурные скобки. После закрывающей фигурной скобки следует точка с запятой (;) – символ, означающий конец определения структуры. Обратите внимание на то, что использование точки с запятой после блока операторов при определении структуры отличает синтаксис структуры от синтаксиса других рассмотренных нами элементов программы. Как мы видели, в циклах, ветвлениях и функциях блоки операторов тоже ограничивались фигурными скобками, однако точка с запятой после таких блоков не ставилась.
Смысл определения структуры
Определение структуры part необходимо для того, чтобы создавать на его основе переменные типа part. Само определение не создает никаких переменных; другими словами, не происходит ни выделения физической памяти, ни объявления переменной. В то же время определение обычной переменной предполагает выделение памяти под эту переменную. Таким образом, определение структуры фактически задает внутреннюю организацию структурных переменных после того, как они будут определены.
Определение структурной переменной
Первый оператор функции main() выглядит следующим образом:
part part1;
Он представляет собой определение переменной part1, имеющей тип part. Определение переменной означает, что под эту переменную выделяется память.
Доступ к полям структуры
Когда структурная переменная определена, доступ к ее полям возможен с применением пока неизвестной нам операции точки. В программе первому из полей структуры присваивается значение при помощи оператора
part1.modelnumber = 6244;
Поле структуры идентифицируется с помощью трех составляющих: имени структурной переменной part1, операции точки (.) и имени поля modelnumber. Подобную запись следует понимать как «поле modelnumber переменной part1». Операция точки в соответствии с общепринятой терминологией называется операцией доступа к полю структуры, но, как правило, такое длинное название не употребляют.
Обратите внимание на то, что в выражении с использованием операции точки (.) на первом месте стоит не название структуры (part), а имя структурной переменной (part1). Имя переменной нужно для того, чтобы отличать одну переменную от другой: part1 от part2 и т. д. С полями структурной переменной можно обращаться так же, как с обычными простыми переменными. Так, в результате выполнения оператора
part1.modelnumber = 6244;
полю modelnumber присваивается значение 6244 при помощи обычной операции присваивания. В программе также продемонстрирован вывод значения поля на экран с помощью cout:
cout << "Модель " << part1.modelnumber;
Инициализация полей структуры
Следующий пример демонстрирует способ, при помощи которого можно инициализировать поля предварительно определенной структурной переменной. В программе используются две структурные переменные.
// partinit.cpp - инициализация структурных переменных #include "iostream" using namespace std; struct part // объявление структуры { int modelnumber; // номер модели изделия int partnumber; // номер детали float cost; // стоимость детали }; ////////////////////////////////////////////////////////// void main() { part part1 = {6244,373,217.55F }; // инициализация переменной part part2; // объявление переменной // вывод полей первой переменной cout << "Модель " << part1.modelnumber; cout << ", деталь " << part1.partnumber; cout << ", стоимость $" << part1.cost << endl; part2 = part1; // присваивание структурных переменных // вывод полей второй переменной cout << "Модель " << part2.modelnumber; cout << ". деталь " << part2.partnumber; cout << ". стоимость $" << part2.cost << endl; }
В приведенной программе определены две переменные типа part: part1 и part2. После того как поля переменной part1 инициализированы, происходит вывод их значений на экран, затем значение переменной part1 присваивается переменной part2, и значения ее полей также выводятся на экран. Результат работы программы выглядит следующим образом:
Модель 6244, часть 373, цена $217.55
Модель 6244, часть 373, цена $217.55
Неудивительно, что обе выведенные строки идентичны, поскольку значение второй переменной было присвоено первой переменной.
Инициализация полей переменной part1 производится в момент ее определения:
part part1 = {6244,373,217.55F };
Значения, которые присваиваются полям структурной переменной, заключены в фигурные скобки и разделены запятыми. Первая из величин присваивается первому полю, вторая — второму полю и т. д.
Присваивание структурных переменных
Как мы видим из программы PARTINT, мы можем присваивать значение одной структурной переменной другой структурной переменной:
part2 = part1;
Значение каждого поля переменной part1 присваивается соответствующему полю переменной part2. Поскольку в больших структурах число полей иногда может измеряться десятками, для выполнения присваивания структурных переменных компилятору может потребоваться проделать большое количество работы.
Обратите внимание на то, что операция присваивания может быть выполнена только над переменными, имеющими один и тот же тип. В случае попытки выполнить операцию присваивания над переменными разных типов компилятор выдаст сообщение об ошибке.
Вложенные структуры
Структуры в языке С++ допускают вложенность, то есть использование структурной переменной в качестве поля какой-либо другой структуры.
struct Distance { int feet; float inches; }; struct Room { Distance length; Distance width; };
Доступ к полям вложенных структур
Если одна структура вложена в другую, то для доступа к полям внутренней структуры необходимо дважды применить операцию точки (.):
dining.length.feet = 13;
В этом операторе dining — имя структурной переменной, как и раньше; Length — имя поля внешней структуры Room; feet — имя поля внутренней структуры Distance. Таким образом, данный оператор берет поле feet поля Length переменной dining и присваивает этому полю значение, равное 13.
Инициализация и вложенные структуры
Далее описывается методика инициализации структурной переменной, которая содержит внутри себя поле, также являющееся структурной переменной:
Room dining = { {13, 6.5),{10, 0.0} };
Значения, которыми инициализируется структурная переменная, заключаются в фигурные скобки и разделяются запятыми.
Первая из внутренних структур инициализируется с помощью конструкции:
{13, 6.5}
а вторая – с помощью конструкции:
{10, 0.0}
Получайте новые статьи блога прямо себе на почту