Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTVETY_K_EKZAMENU_PO_OOP.doc
Скачиваний:
10
Добавлен:
01.07.2025
Размер:
239.62 Кб
Скачать

29. Парамизованые классы.

Шаблон класса задает способ построения отдельных класов. Шаблоны класса vector:

template <class T> class vector {private:T* fitems; int fcount; public: vector(int);T& operator[](const int index);T&getitem(const int index){. . . return fitems[index];}; Префикс template <class T> указывает, что объявл шаблон с типовым парамом Т. Теперь посредством замены типового парама конкретным типом можно образовать конкретный класс, кот далее может использоваться для описания переменых, как и любой др тип даных: Класс, сгенерированый из шаблона явл совершено нормальным класом. Поэтому исп-ние шаблона не подразумевает каких-либо дополнительных механизмов (и связаных с ними расходов памяти и времени) на этапе выполнения проги по сравнению с тем, что использовалось бы, если бы необходимый конкретный класс был написан «вручную». С др стороны, исп-ние шаблонов не подразумевает обязательного уменьшения объема объектного кода. Компоненты шаблона объявл и описываются точно так же, как и компоненты обычного класса, т.е. либо внутри, либо вне класса. Компонентная функция шаблона класса явл шаблоном функции, парамизованом парамами шаблона класса. Ее внешнее описание осуществляется согласно следующему синтаксису: template <список-парамов-шаблона> тип-рез-та имя-шаблона-класса<список-парамов-шаблона>::описание-функции.Процес генерации объявления конкретного класса из шаблона класса - конкретизация шаблона (template instantiation). Класс, сгенерированый из шаблона (напр, класс, обозначаемый именем vector<int>), назется шаблоным класом (template class). Парамами шаблонов класов могут быть типовые парамы, обычные парамы и парамы-шаблоны. При конкретизации шаблона типы фактических парамов отождествляются с соответствующими (по порядку) типами из списка-парамов-шаблона и должны соответствовать им по кол-ву. У шаблона может быть несколько парамов. Парам шаблона может быть использован для описания следующих парамов. Парамы целого типа обычно исп-ются для задания размеров и границ. Простые контейнеры с ограничеными возможностями могут быть полезными, когда компактность кода и эфективность во время выполнения проги имеют первостепеное значение. Передача размера буфера в качестве аргумента шаблона позволяет его разработчику избежать использования лишней памяти. Арг-ты целого типа всегда должны быть константными выражениями. Нетиповый парам шаблона явл константой в теле шаблона, и потому попытка изменения его значения явл ошибкой.

30. Парамизованые функции.

Шаблон функций определяет потенциально неограниченое множво функций, генерируемых из шаблона. Все параметры шаблона функции должны быть типовыми. Семейство функций сортировки: template <class T> void sort(vector<T>); В противовес конкретизации шаблонов класов типовые арг-ты шаблона функ при его конкретизации явным образом обычно не задаются, а выводятся из типов арг-тов функ, поэтому шаблон функц расматривается как множво функц с совмещеным именем. Если типовые арг-ты не могут быть выведены из типов арг-тов функции, они должны задаваться явно, как при конкретизации шаблонов класов. Функция, сгенерированая из шаблона, назется шабл функцией (template function). Шабл функция может совмещать имя с дри шабл и обык функциями. Распознавание функции выполняется в три шага: 1. Поиск обыч функции, парамы кот в точности соответствуют требуемым; если таковая находится, обращение производится к ней. 2.Поиск шабл функц, из кот может быть сгенерирована функ при точном соответствии парамов; если она найдена, она вызывается. 3. Поиск обыч функ, типы формальных парамов кот лучше всего соответствуют фактическим парамам вызова; если она найдена, она вызывается. Если отождествление не найдено, фиксируется ошибка. При отождествлении с шабл не применяются даже тривиальные преобразования. Если на каком-либо, этапе будет найдено больше одного подходящего определения, также фиксируется ошибка. Для генерации отдельных версий шабл необходимо описание шабл; для порождения обращений к этим отдельным версиям достаточно объявления шабл. Компонентная функция шабл класса неявно оказывается шабл функцией, парамами шабл кот явл парамы шаблона класса. Конкретизация такой функции осуществляется вместе с конкретизацией самого шаблона класса независимо от того, описана ли функция в шаблоне или вне его.