- •Цель работы
- •2 Техническое обеспечение
- •3 Программное обеспечение
- •4 Постановка задачи
- •Общие сведения
- •5.1 Шаблоны классов
- •5.1.1 Пример класса-шаблона
- •5.1.2 Параметры шаблона, задаваемые по умолчанию
- •5.1.3 Специализация шаблона класса
- •5.1.4 Статические элементы в шаблонах
- •5.1.5 Шаблоны классов с шаблонами
- •5. 2 Шаблоны функций
- •5.3 Обобщенные алгоритмы и функторы
- •Варианты заданий
- •7 Указания к выполнению лабораторной работы
- •9 Контрольные вопросы
Министерство общего и профессионального образования Ростовской области
Государственное бюджетное образовательное учреждение среднего профессионального образования Ростовской Области
«Таганрогский колледж морского приборостроения»
МДК.01.02 Прикладное программирование
Методические рекомендации
по выполнению лабораторной работы № 13
«Шаблоны»
Время выполнения работы – 4 часа
Таганрог
2016
Цель работы
Получение навыков в разработке программ с использованием шаблонов классов.
2 Техническое обеспечение
Персональная ЭВМ IBM PC/486 и более поздних моделей.
Клавиатура.
Дисплей.
Печатающее устройство.
3 Программное обеспечение
3.1 Операционная система Windows XP и более поздние версии.
3.2 Система программирования Visual C++ версия 6.0 и более поздние версии.
4 Постановка задачи
Выполнить задание согласно варианта, приведенного в разделе 6 настоящих методических указаний.
Общие сведения
Такие контейнеры, как стеки и очереди, характеризуются дисциплиной доступа к элементам и фактически не зависят от типа элементов. Аналогично, контейнер-массив представляет независимый от типа доступ к элементам с помощью операции индексирования. Создать универсальный контейнер, безразличный к типу элементов, можно двумя способами:
используя в качестве элемента контейнера указатель void *;
на основе шаблона класса, в котором тип элементов задается параметром шаблона.
Первый способ – наследие от С, поскольку в этом языке не было других средств. В С++ обычно используется другой способ – так называемые шаблоны.
5.1 Шаблоны классов
Шаблон класса является заготовкой, из которой создаются конкретные классы в процессе инстанцирования (то есть создания сущности, инстанции). Делается это путем подстановки конкретного типа в качестве аргумента. Шаблон класса еще называют параметризованным типом. Термин «параметризованный тип» эквивалентен терминам «шаблон класса» и «шаблон».
Синтаксис класса-шаблона выглядит так:
template <параметры> // объявление шаблона
class имя_класса
{ // определение класса
};
Префикс template <параметры> показывает компилятору, что следующее определение класса является шаблоном, а не обычным классом. Шаблоном может быть и структура. Как и имя обычного класса, имя класса-шаблона не должно совпадать с другими именами в одной области видимости. Параметры шаблона могут быть следующих видов:
параметр-тип;
параметр целочисленного или перечислимого типа;
параметр-указатель на объект или указатель на функцию;
параметр-ссылка на объект или ссылка на функцию;
параметр-указатель на член класса.
К целочисленным типам относятся все целые, символьные и булевский (bool) типы. Нельзя использовать в качестве параметра ни один из встроенных дробных типов ни float, ни double, ни long double. Параметры шаблона, если их несколько, записываются через запятую. Все виды параметров, кроме параметра-типа, пишутся обычным образом (как в функциях), например:
long р, int (*f)(double), int *t, const char *s
Имена параметров видимы в пределах всего шаблона, поэтому внутренние для шаблона имена должны быть разными.
Параметр-тип является наиболее часто используемым и объявляется как
class имя
или
typename имя
В качестве имени параметра разрешается применять любой допустимый идентификатор. Внутри класса такой параметр может появляться на тех местах, где позволено писать конкретный тип.
Шаблон структуры-пары с двумя полями разного типа можно определить разными способами:
template <class T1, class T2>
struct Pair { Tl first; T2 second; };
template <typename T1, typename T2>
struct Pair { T1 first; T2 second; };
template <class T1, typename T>
struct Pair { T1 first; T second; };
Шаблон, как и обычный класс, можно объявить. Объявление состоит из заголовка шаблона и не включает в себя тело класса, например:
template <typename Т> class Stack;
template <typename T1, typename T2> struct Pair;
template <class T> class Array;
Определение объектов для некоторого класса-шаблона в общем виде выглядит так:
имя_класса_шаблона <аргументы> имя_объекта; // одиночный объект
имя_класса_шаблона <аргументы> имя_объекта[количество]; //массив
имя_класса_шаблона <аргументы> *имя_обьекта; // указатель
Или для случая константной ссылки в качестве параметра:
const имя_класса_шаблона <аргументы> &имя_объекта;
В угловых скобках на месте параметров при объявлении объектов задают конкретные аргументы. Параметры шаблона являются позиционными (как и аргументы функции), поэтому подставляемое фактическое значение должно соответствовать виду параметра шаблона: если на данном месте в определении класса-шаблона находился параметр-тип, то и аргумент должен быть типом или классом. Например, определение конкретных объектов-пар может быть таким:
Pair <int, int> х;
Pair <int, double> у;
Pair <string, date> d;
В качестве аргумента-типа можно использовать и класс-шаблон, например:
Pair <Pair <int, long>, float> pair;
