Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования С++ и его «подводные камни».DOC
Скачиваний:
39
Добавлен:
01.05.2014
Размер:
1.02 Mб
Скачать

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 и его варианты.

Их использование исключает необходимость самостоятельной разработки и длительной отладки, и больше времени можно уделить прикладной части приложения.

Для тех кто заинтересовался шаблонами, могу порекомендовать прекрасную книгу Герберта Шилдта «Теория и практика С++»,

24