Шаблон структуры. Внешний и внутренний шаблоны. Структурная переменная
Термин «структура» в языке программирования С++ соответствует двум разным по смыслу понятиям:
1) обозначение места в памяти, где располагается информация; далее это место называется структурной переменной;
2) правила форматирования структурной переменной, используемые компилятором для выделения ей места в памяти и организации доступа к ее полям; далее такие правила называются шаблоном структуры или шаблоном структурной переменной.
Как и любую переменную, структурную переменную необходимо описать. Это описание состоит из двух шагов:
1) задание шаблона структуры;
2) собственно описание структурной переменной.
Каждый шаблон имеет собственное имя для того, чтобы компилятор мог различать различные шаблоны. В том случае, если в функции используется единственный шаблон, он может иметь имя «нет имени», что задается пропуском pattern_name при описании шаблона. Имена шаблонов должны быть уникальными в пределах их области определения, и в частности в пределах одной функции может быть только один шаблон с именем «нет имени». Синтаксис задания шаблона таков:
struct pattern_name{
type1 field_name1;
type2 field_name2;
…………………
typeN field_nameN;
};
где pattern_name – имя шаблона, удовлетворяющее правилам задания идентификаторов языка С++; type1, type2, …, typeN – любые типы, например int, char, float; field_name1, field_name2, …, field_nameN – имена полей, удовлетворяющие правилам задания идентификаторов языка С++. Например:
struct BOOK{
char name[20];
char title[44];
int year; float price;};
Имена полей в одном шаблоне должны быть уникальными. Однако в разных шаблонах можно иметь совпадающие имена полей. Кроме того, имена шаблонов проверяются на «уникальность» друг с другом, а не с метками или именами переменных. Раз так, то имя шаблона может и совпадать с именами полей, переменных или метками.
Задание шаблона никоим образом не связано с резервированием какой-либо памяти компилятором. Шаблон дает компилятору всю необходимую информацию о полях структурной переменной для резервирования места в памяти и организации доступа к этой памяти при описании структурной переменной и ссылках на отдельные поля структурной переменной. Фактически шаблон – это задание нового типа struct pattern_name. В приведенном примере был введен новый тип struct BOOK.
Как и простая переменная, шаблон имеет область определения (видимость). Если шаблон описан внутри блока {}, это локальный шаблон, видимый только из пределов данного блока, в частности из пределов конкретной функции. Если описание шаблона помещено вне блоков, такой шаблон видим во всех функциях ниже точки описания шаблона до границы файла. Нельзя описать шаблон с реквизитом extern.
Когда задан шаблон, может быть описана структурная переменная. Описание структурной переменной состоит из задания типа и имени структурной переменной. Например:
struct BOOK first_book;
Здесь описывается структурная переменная по приведенному ранее шаблону BOOK. Компилятор выделит под переменную число байтов памяти, достаточную для хранения всех ее полей. Число байтов, выделенное под структурную переменную, не всегда равно сумме длин отдельных полей из-за влияния дополнительного фактора внутреннего представления структурных переменных, называемого выравниванием (см. подраздел 8.5). Точно выделенное число байтов всегда возвращает операция sizeof(struct pattern_name).
Синтаксис языка программирования С++ разрешает совмещать описание шаблона и структурной переменной, например, так:
struct BOOK{
char name[20];
char title[44];
int year; float price;
} first_book, child_book, dog_book;
Для структурных переменных действуют правила видимости и времени жизни, подробно рассмотренные в главе 7.
Для доступа к отдельным полям структурной переменной используют операцию ‘.’, формируя ссылку на нужное поле из имени структурной переменной и имени нужного поля. Такая ссылка может располагаться в любом месте выражений, где допустимы ссылки на простые переменные. Например, если сделано ранее рассмотренное описание структурных переменных, корректными будут следующие выражения:
first_book.year = 1992;
dog_book.year = first_book.year;
strcpy(child_book.title, "Белый Бим Черное Ухо");
scanf("%f", &first_book.price);
Ссылка на поле структурной переменной обладает всеми свойствами обычных переменных. Если поле - это массив символов, то например child_book.title - это указатель-константа на первый элемент массива. Можно определить адрес первого байта поля. Естественно, что ссылка на поле структурной переменной может располагаться как слева, так и справа от операции присваивания. Так же, как и для обычных операндов, действуют правила преобразования типов при употреблении операндов разных типов.
Если структурные переменные соответствуют одному шаблону, допускается операция присваивания таких структурных переменных. Например, для ранее описанных структурных переменных first_book, child_book и dog_book будут корректными такие выражения:
first_book = child_book;
first_book = child_book = dog_book;
Операция присваивания структурных переменных приводит к физической пересылке в памяти числа байтов, равного размеру шаблона структурной переменной. В приведенном примере три структурные переменные будут иметь поля, совпадающие с полями структурной переменной dog_book.
При описании структурной переменной разрешается выполнять инициализацию полей переменной. Например:
struct BOOK{
char name[20];
char title[44];
int year; float price;
}
struct BOOK first_book =
{"Митчелл М.", "Унесенные ветром", 1991, 5.25},
child_book = {"Троепольский Г.Н.", "Белый Бим Черное Ухо", 1980, 2.78},
dog_book = {"Михайлов О.С.", "Воспитание щенка", 1968, 0.47};
Разрешается объединять задание шаблона, описание структурных переменных и их инициализацию в одном предложении языка С++.
Для упрощения описания структурных переменных можно использовать оператор typedef описания собственного типа данных. Это упрощает текст программы. Общая форма предложения конструирования собственного типа данных:
typedef описание_типа имя_нового_типа;
Например:
typedef struct BOOK{
char name[20];
char title[44];
int year; float price;
}MY_BOOKS;
Затем можно использовать сконструированный тип для описания необходимых данных, например так:
MY_BOOKS dog_book; //то же самое, что и struct BOOK,
//но запись несколько короче
Здесь используется для создания собственного типа именованный шаблон BOOK.
Однако использование имени шаблона совсем не обязательно, т.е. можно записать:
typedef struct {
char name[20];
char title[44];
int year; float price;
}BOOKS;
typedef struct { char class,subclass;
int number;}MY_UDC;
Дата добавления: 2017-01-29; просмотров: 1019;