Структуры и объединения
Наряду с массивами в C++ имеются данные типа структур и объединений. Структура - упорядоченная совокупность данных различных типов, к которой можно обращаться как к единому данному. Описание структурного типа имеет следующий вид: struct идентификатор { деклараторы членов } деклараторы-инициализаторы; Такое объявление выполняет две функции: во-первых, объявляется структурный тип; во-вторых, объявляются переменные этого типа. Идентификатор после ключевого слова struct является именем структурного типа. Имя типа может отсутствовать, тогда тип будет безымянный и в других частях программы нельзя будет объявлять данные этого типа. Деклараторы-инициализаторыобъявляют конкретные переменные структурного типа (т.е. данные описанного типа, указатели на этот тип и массивы данных). Деклараторы-инициализаторымогут отсутствовать, в этом случае объявление описывает только тип структуры. Например, структура, описывающая точку на плоскости, может быть определена так: struct Point_strct // Имя структуры { int х, у; } // Деклараторы членов структуры pointN, *ptr_to_point, arraypoint[ 3 ]; // Данные структурного типа Члены (компоненты) структуры описываются аналогично данным соответствующего типа и могут быть скалярными данными, указателями, массивами или данными другого структурного типа. Например, для описания прямоугольника со сторонами, параллельными осям координат, можно предложить несколько вариантов: struct RectN1{ Point p1; // Координаты левого верхнего угла Point p2; // Координаты правого нижнего угла }; struct RectN2 { Point p[2]; }; struct RectN3{ Point p; // Левый верхний угол int width; // Ширина int high; // Высота прямоугольника }; Поскольку при описании членов структуры должны использоваться только ранее определенные имена типов, предусмотрен вариант предварительного объявления структуры, задающий только имя структурного типа. Например, чтобы описать элемент двоичного дерева, включающий указатели на левую и правую ветви дерева и указатель на некоторую структуру типа ValueD, содержащую значение данного в узле, можно определить следующие структуры: struct ValueD; struct Tree_element { ValueD *val; Tree_element *left, *right; }; Членами структур могут быть битовые поля, когда в поле памяти переменной целого типа (int или unsigned int) размещается несколько целых данных меньшей длины. Пусть, например, в некоторой программе синтаксического разбора описание лексемы содержит ее тип (до шести значений) и порядковый номер лексемы в таблице соответствующего типа (до 2000 значений). Для представления значения типа лексемы достаточно трех двоичных разрядов (трех бит), а для представления чисел от 0 до 2000 – 11 двоичных разрядов (11 бит). Описание структуры, содержащей сведения о лексеме: struct Lxm { unsigned int type_lex: 3; unsigned int num_lex: 11; }; Двоеточие с целым числом после имени члена структуры указывает на битовое поле, целое число на размер поля в битах Объединение - это структура, все компоненты которой размещаются в памяти с одного и того же адреса. Таким образом, объединение в каждый момент времени содержит один из возможных вариантов значений. Для размещения объединения в памяти выделяется участок, достаточный для размещения члена объединения самого большого размера. Применение объединения также позволяет обращаться к одному и тому же полю памяти по разным именам и интерпретировать как значения разных типов. Описание объединения строится по той же схеме, что и описание структуры, но вместо ключевого слова struct используется слово union, например, объединение uword позволяет интерпретировать поле памяти либо как unsigned int, либо как массив из двух элементов типа unsigned char. union uword { unsigned int u; unsigned char b[2]; }; Описания типов, объявляемых программистом, в т.ч. структур и объединений, могут быть достаточно большими, поэтому в C++ предусмотрена возможность присваивания типам собственных имен (синонимов), достигая при этом повышения наглядности программных текстов. Синоним имени типа вводится с ключевым словом typedef и строится как обычное объявление, но идентификаторы в деклараторах в этом случае интерпретируются как синонимы описанных типов. Синонимы имен типов принято записывать прописными буквами, чтобы отличать их от идентификаторов переменных. Несколько примеров объявления синонимов имен типов: typedef struct { double re, im } COMPLEX; typedef int *pINT; После таких объявлений синоним имени может использоваться как спецификатор типа: COMPLEX compl, pcompl; //переменная типа // COMPLEX и указатель на COMPLEX pINT Описание структур и объединений в основном соответствует их построению в языке Си. В C++ структуры и объединения являются частными случаями объектных типов данных.
|