{lang: ‘ru’}

нули и еденицы, структуры в языке сВ предыдущих статьях мы рассматривали только переменные.  Переменные стандартных типов, таких, как 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}


Получайте новые статьи блога прямо себе на почту