Шаблон структуры. Внешний и внутренний шаблоны. Структурная переменная 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Шаблон структуры. Внешний и внутренний шаблоны. Структурная переменная



 

Термин «структура» в языке программирования С++ соответствует двум разным по смыслу понятиям:

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;

 

Вложенные структуры

 

Поле структурной переменной может иметь любой тип, в том числе и быть другой структурой. Поле, являющееся структурой, называют вложенной структурой. Естественно, что шаблон вкладываемой структуры должен быть уже известен компилятору. Например:

/* Prim8_1.cpp */

struct UDC{

char class, subclass;

int number;

};

struct BOOK{

struct UDC udc_class;

char name[20];

char title[44];

int year; float price;

} first_book, child_book, dog_book;

В данном примере описывается шаблон структуры, имеющий вложенную структуру, и три структурные переменные по шаблону BOOK, т.е. и для вложенных структур действуют те же правила описания полей: задается шаблон (в данном примере это struct UDC) и имя поля (в шаблоне BOOK это udc_class).

Ссылка на поле вложенной структуры формируется из имени структурной переменной, имени структурного поля и имени поля вложенной структуры. Перечисленные имена разделяются символом '.' операции точка. Например, если сделано описание структурных переменных по приведенному ранее шаблону BOOK с вложенной структурой UDC, будут корректны следующие выражения:

first_book.udc_class.class = ‘A’;

dog_book.udc_class.number = 681;

Структура не сожет вкладываться сама в себя, т.е. некорректным будет следующее выражение:

struct BOOK{

struct BOOK my_own; // это ошибка

char name[20];

char title[44];

int year; float price;

};

Разрешается использовать описываемый шаблон, если одно из полей является указателем на описываемую структуру. Например:

struct BOOK{

struct BOOK *my_own; // это разрешается

char name[20];

char title[44];

int year; float price;

};

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 366; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 44.222.175.73 (0.01 с.)