русс | укр

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

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

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

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


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

Родовые функции


Дата добавления: 2013-12-23; просмотров: 4465; Нарушение авторских прав


Шаблоны функций

 

Шаблон является одним из наиболее сложных и мощных средств С++. Шаблонов не было в исходных спецификациях С++; они были добавлены лишь несколько лет назад и поддерживаются всеми современными компиляторами С++. Шаблоны помогают вам достичь одной из самых трудноуловимых целей в программировании: созданию повторно используемого кода.

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

 

 

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

Родовая функция создается с помощью ключевого слова template.Обычное значение этого слова (шаблон в переводе на русский язык) точно отражает его использование в С++. С помощью template создается шаблон или каркас, который описывает, что должна делать эта функция, оставляя для компилятора задачу заполнения этого каркаса требуемыми деталями. Общая форма определения родовой функции выглядит так:



 

template <typename тип>

тип-возврата имя-функции{список-параметров)

{

//тело функции

}

 

Здесь тип — это условное имя обобщенного, родового типа обрабатываемых данных. Это имя затем используется внутри определения функции для объявления типа данных, с которыми будет работать функция. Компилятор, создавая конкретный вариант функции, автоматически заменит тип на тип фактически используемых данных. Хотя использование ключевого слова class для задания родового типа в объявлении шаблона стало традиционным, вы можете также использовать ключевое слово typename.

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

// Пример родовой функции.

 

#include <iostream>

using namespace std;

 

// Родовая функция, которая обменивает значения своих аргументов.

// Здесь X - это родовой тип данных.

// Это родовая функция.

template <typename X> void swapargs (X &a, X &b)

{

X temp;

temp = a;

a = b;

b = temp;

};

 

int main ()

{

int i = 10, j =20;

double x=10.1, y=23.3;

char a='x', b='z';

 

cout << "Исходные i, j: " << i << ' ' << j << '\n';

cout << "Исходные x, y: " << x << ' ' << y << '\n';

cout << "Исходные a, b: " << a << ' ' << b << '\n';

 

swapargs (i, j ) ; // обменяем целые

swapargs (x, y) ; // обменяем значения с плавающей точкой

swapargs (a, b) ; // обменяем символы

 

cout << "После обмена i, j: " << i << ' ' << j << '\n';

cout << "После обмена x, у: " << x << ' ' << y << '\n';

cout << "После обмена a, b: " << a << ' ' << b << '\n';

 

_getch();

return 0;

}

 

Рассмотрим детально эту программу. Строка

 

template <typename Х>

void swapargs (X &a, X &b)

 

сообщает компилятору, что, во-первых, создается шаблон и, во-вторых, что начинается родовое объявление. В этой строке X — это условное имя родового типа. Далее объявляется функция swapargs(). которая использует X как тип данных для обмениваемых значений. В main()функция swapargs() вызывается с аргументами трех различных типов: int, float и char. Поскольку swapargs() является родовой функцией, компилятор автоматически создает три варианта swapargs(): один, который будет обменивать целые числа, другой для обмена чисел с плавающей точкой и третий для символов. Таким образом, одна и та же родовая функция swapargs() может быть использована для обмена аргументов любых типов данных.

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

 



<== предыдущая лекция | следующая лекция ==>
Перегрузка функций | Рекурсия


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


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

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

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


 


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

 
 

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

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