- •1. Дополнения к с
- •1.1. Комментарии
- •1.2. Ключевые слова
- •1.3. Константы
- •1.4. Блочные объявления
- •1.5. Ссылки
- •1.6. Новая роль имён перечислений, структур и объединений
- •1.7. Распределение памяти
- •1.8. Встраиваемые функции
- •1.9. Перегрузка функций
- •1.10. Задание для параметров функции значений по умолчанию
- •1.11. Дополнительные операции для доступа к данным
- •1.12. Предопределённые потоки ввода-вывода
- •2.1. Инкапсуляция
- •2.2. Разграничение доступа (скрытие данных и методов)
- •2.3. Друзья классов
- •2.4. Конструкторы и деструкторы
- •2.5. Конструктор по умолчанию
- •2.6. Конструктор копирования
- •2.7. Несколько слов о деструкторах
- •2.8. Перегрузка операций
- •3.1. Наследование
- •3.2. Виртуальные функции –полиморфизм
- •3.3. Шаблоны
3.3. Шаблоны
Метаморфозы, происходящие в мире программирования, просто удивительны. До сих пор в этой главе мы много говорили о достоинствах инкапсуляции — сведении в единый объект данных и методов для работы с ними. Теперь речь пойдет о шаблонах (template). Понятие шаблона в С++ обеспечивает то, что в литературе называют параметризованным типом и имеет сходство с соответствующими средствами языков Clu и Ada. Одним из основных достоинств шаблона является то, что они позволяют отделить метод от данных (!). Шаблоны настолько значительно изменяют внешнюю сторону программирования, что по праву могут считаться одной из самых важных особенностей С++. Они предназначены для создания функций и классов, отличающихся друг от друга только типом обрабатываемых ими данных. Такие функции и классы часто называют соответственно параметризованными функциями (generic functions) и параметризованными классами (generic classes) Для их определения в язык С++ введено ключевое слово template.
Знакомство с шаблонами начнем с параметризованных классов. Общий синтаксис объявления шаблона имеет следующий вид:
template < class tType > // Дальше пойдёт шаблон
class className
{
// Компоненты класса
};
Здесь префикс template <class cType> говорит о том, что описывается параметризованный класс, имеющий в качестве параметра тип шаблона cType, При необходимости можно определить несколько параметризованных типовданных, разделяя их запятой. В пределах определения класса имя cType можно использовать в любом месте.
className < dataType > clObj;
Тип данных, который заменяет собой переменную *:Туре и которыми фактически оперирует класс, задается параметром dataТуре, например:
После того как параметризованный класс объявлен, можно создавать его конкретную реализацию:
className <float *> clObj;
В результате такого определения на этапе компиляции на основании заданного типа будет автоматически сгенерирован соответствующий объект. Таким образом, использование шаблонов не влечет никаких дополнительных временных издержек по сравнению с явно задаваемыми типами.
Методы параметризованного класса являются параметризованными функциями, и, когда они определяются вне базового класса, параметр типа шаблона должен быть указан явно, например:
template < classType > void className < tType > :: memberFunc( )
{
// Тело функции
}
Замечательно здесь то, что за формирование версии каждой параметризованной функции для каждого типа аргумента отвечает компилятор, а не программист.
Можно определить параметризованные функции, не являющиеся методами какого-либо класса. Общий синтаксис такого объявления имеет вид:
template < class tType > retType funcName (parameterList);
Во всем остальном такие функции ничем не отличаются от обычных.
При рассмотрении шаблонов используются и другие термины, которые можно встретить в литературе по С++. Конкретную версию функции, создаваемую компилятором, называют порожденной функцией (generated function). Процесс построения такой функции называетсяконкретизацией (instantiating).
После знакомства с шаблонами С++ легко создать классы контейнеров, которые будут работать с широким кругом типов данных, как встроенных в язык, так и создаваемых программистом. Большую пользу в этом процессе оказывает уже упоминавшаяся библиотека классов MFC, в которую входят специальные классы для хранения групп объектов:
– Массивы – класс САггау и его варианты,
– Списки – класс CList и его варианты.
– Ассоциативные списки (словари) – класс CMap и его варианты.
Их использование исключает необходимость самостоятельной разработки и длительной отладки, и больше времени можно уделить прикладной части приложения.
Для тех кто заинтересовался шаблонами, могу порекомендовать прекрасную книгу Герберта Шилдта «Теория и практика С++»,