русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Шаблоны классов.


Дата добавления: 2015-07-09; просмотров: 1460; Нарушение авторских прав


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

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

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

Создание шаблонов классов

Синтаксис описания шаблона:

template <описание_параметров_шаблона> определение_класса;

Параметры шаблона перечисляются через запятую. В качестве параметров могут использоваться типы, шаблоны и переменные.

Типы могут быть как стандартными, так и определенными пользователем. Для их описания используется ключевое слово class. Внутри шаблона параметр типа может применяться в любом месте, где допустимо использовать спецификацию типа, например:

template <class Data> class List{

class Node{

public:

Data d: Node *next: Node *prev;

Node(Data dat = 0){d - dat; next = 0: prev = 0;}

}

}

Класс Data можно рассматривать как формальный параметр, на место которого при компиляции будет подставлен конкретный тип данных.

Область действия параметра шаблона — от точки описания до конца шаблона.

Методы шаблона класса автоматически становятся шаблонами функций. Если ме­тод описывается вне шаблона, его заголовок должен иметь следующие элементы:

template <описание_паранетров_шаблона> возвр_тип иня_класса <параметры_шаблона>:: иня_функции (список_параметров функции)

Описание параметров шаблона в заголовке функции должно соответствовать шаблону класса, при этом имена параметров могут не совпадать. Проще рассмот­реть синтаксис описания методов шаблона на примере:



template <class Data> void List<Data>::print() { /* тело функции */ }

Здесь <class Data>— описание параметра шаблона, void — тип возвращаемого функцией значения, List — имя класса, <Data>— параметр шаблона, print — имя функции без параметров.

Ниже перечислены правила описания шаблонов.

□ Локальные классы не могут содержать шаблоны в качестве своих элементов.

□ Шаблоны методов не могут быть виртуальными.

□ Шаблоны классов могут содержать статические элементы, дружественные функции и классы.

□ Шаблоны могут быть производными как от шаблонов, так и от обычных классов, а также являться базовыми и для шаблонов, и для обычных классов.

□ Внутри шаблона нельзя определять friend-шаблоны.

При определении синтаксиса шаблона было сказано, что в него, кроме типов и шаблонов, могут передаваться переменные. Они могут быть целого или перечис­ляемого типа, а также указателями или ссылками на объект или функцию. В теле шаблона они могут применяться в любом месте, где допустимо использовать константное выражение.

После создания и отладки шаблоны классов удобно помещать в заголовочные файлы.

Использование шаблонов классов

Чтобы создать при помощи шаблона конкретный объект конкретного класса (этот процесс называется инстанцированием), при описании объекта после име­ни шаблона в угловых скобках перечисляются его аргументы:

Имя шаблона <аргументы> имя_объекта [(параметры_конструктора)]:

Аргументы должны соответствовать параметрам шаблона. Имя шаблона вместе с аргументами можно воспринимать как уточненное имя класса. Примеры созда­ния объектов по шаблонам, описанным в предыдущем разделе:

List <int> List_int;

List <double> List_double;

List <monstr> Listjnonstr:

Block <char, 128> buf;

Block <monstr. 100> stado;

При использовании параметров шаблона по умолчанию список аргументов мо­жет оказаться пустым, при этом угловые скобки опускать нельзя:

template<class Т = char> class String;

String* p;

На месте формальных параметров, являющихся переменными целого типа, должны стоять константные выражения.

После создания объектов с помощью шаблона с ними можно работать так же, как с объектами обычных классов.

Для упрощения использования шаблонов классов можно применить переимено­вание типов с помощью typedef:

typedef List <double> Ldbl;

Ldbl List_double;

 

Специализация шаблонов классов

Каждая версия класса или функции, создаваемая по шаблону, содержит одинако­вый базовый код; изменяется только то, что связано с параметрами шаблона. При этом эффективность работы версий, создаваемых для различных типов данных, может сильно различаться.

Если для какого-либо типа данных существует более эффективный код, можно либо предусмотреть для этого типа специальную реализацию отдельных мето­дов, либо полностью переопределить (специализировать) шаблон класса.

Для специализации метода требуется определить вариант его кода, указав в заго­ловке конкретный тип данных.

 

Достоинства и недостатки шаблонов

Шаблоны представляют собой мощное и эффективное средство обращения с раз­личными типами данных, которое можно назвать параметрическим полиморфиз­мом, а также обеспечивают безопасное использование типов, в отличие от макро­сов препроцессора. Однако следует иметь в виду, что программа, использующая шаблоны, содержит полный код для каждого порожденного типа, что может уве­личить размер исполняемого файла. Кроме того, с некоторыми типами данных шаблоны могут работать не так эффективно, как с другими. В этом случае имеет смысл использовать специализацию шаблона.

Стандартная библиотека С++ предоставляет большой набор шаблонов для раз­личных способов организации хранения и обработки данных.

 

Часть 3:



<== предыдущая лекция | следующая лекция ==>
Абстрактные базовые классы. | Множественное наследование.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.352 сек.