|
Программирование >> Структурное программирование
Давайте рассмотрим в качестве примера шаблон функции printArray, приведенный на рис. 12.1. Этот шаблон используется в программе, приведенной на рис. 12.2. В шаблоне функции printArray объявляется один формальный параметр Т (вместо идентификатора Т может быть использован любой другой допустимый идентификатор) для типа массива, который будет выводиться функцией printArray; template<class Т> I void printArray(Т *array, const int count) { for (int i = 0; i < count; i++) cout array[i] ; cout endl; Рис. 12.1. Шаблон функции Т называется параметром типа. Когда компилятор обнаруживает в тексте программы вызов функции printArray, он заменяет Т во всей области определения шаблона на тип первого параметра функции printArray и С4-4-создает шаблонную функцию вывода массива указанного типа данных. После этого вновь созданная функция компилируется. В программе, приведенной на рис. 12.2, производится вызов трех функций printArray: одна выводит Все описания шаблонов функций начинаются с ключевого слова template, за которым следует список формальных параметров шаблона, заключаемый в угловые скобки (< и >); каждому формальному параметру должно предшествовать ключевое слово class, как в следующих примерах: template <class Т> template <class ElementType> template <class BorderType, class FillType> Формальные параметры в описании шаблона используются (наряду с параметрами встроенных типов или типов, определяемых пользователем) для определения типов параметров функции, типа возвращаемого функцией значения и типов переменных, объявляемых внутри функции. Далее, за этим заголовком, следует обычное описание функции. Заметьте, что ключевое слово class, используемое в шаблоне функции при задании типов параметров, фактически означает любой встроенный тип или тип, определяемый пользователем . Типичная ошибка программирования 12.1 Ошибкой является отсутствие в шаблоне ключевого слова class перед каждым формальным параметром типа. Типичная ошибка программирования 12.2 Ошибка возникает, когда в списке параметров функции используются не все формальные параметры шаблона функции. На рис. 12.2 приведена программа, использующая шаблон функции printArray. Программа начинается с определения массива а типа int, массива b типа float и массива с типа char с размерами соответственно 5, 7 и 6. Затем каждый из массивов выводится на экран при помощи вызова функции printArray: один раз с первым аргументом равным а типа int *, затем с аргументом b типа float * и в третьем вызове в качестве первого аргумента используется массив с типа char *. В результате вызова printArray (а, aCount); компилятор создает шаблонную функцию printArray, в которой вместо параметра типа Т используется тип int. Вызов функции printArray (Ь, bCount); приводит к созданию второй шаблонной функции printArray, в которой параметр типа Т заменяется на тип float. При обработке вызова функции printArray (с, cCount); компилятор создает третью шаблонную функцию printArray, для которой параметр типа Т заменяется на тип char. Совет по повышению эффективности 12.1 Шаблоны несомненно расширяют возможности многократного использования программного кода. Но имейте в виду, что программа может создавать слишком много копий шаблонных функций и шаблонных классов. Для этих копий могут потребоваться значительные ресурсы памяти. массив типа int, др5п: ая выводит массив чисел с плавающей запятой и третья обрабатывает массив символов. Например, реализация функции для типа int будет выглядеть следующим образом: void printArray(int *array, const int count) ( for (int i = 0; i < count; i++) cout << array[i] << ; cout << endl; Каждый формальный параметр из описания шаблона функции должен появиться в списке параметров функции по крайней мере один раз. Имя формального параметра может использоваться в списке параметров заголовка шаблона только один раз. Одно и то же имя формального параметра шаблона функции может использоваться несколькими шаблонами. S * Массив а содержит: 1 2 3 4 5 Массив Ь содержит: 1.1 2.2 3.3 4.4 5.5 6.6 7.7 Массив с содержит: А HELLO Рис. 12.2. Пример использования шаблонных функций 12.3. Перегрузка шаблонных функций Шаблонные функции и перегрузка функций тесно связаны друг с другом. Все родственные функции, полученные из шаблона, имеют одно и то же имя; поэтому компилятор использует механизм перегрузки для того, чтобы обеспечить вызов соответствующей функции. Сам шаблон функции может быть перегружен несколькими способами. Мы можем определить другие шаблоны, имеющие то же самое имя функции, но различные наборы параметров. Например, шаблон функции printArray на рис. 12.2 может быть перегружен другим шаблоном функции printArray, который имеет дополнительные параметры lowSubscript и highSubscript для Использование шаблонных функций #include <iostream.h> template<class Т> void printArray(Т *array, const int count) { for (int i = 0; i < count; i++) cout array[i] ; cout endl; main() { const int aCount = 5, bCount = 7, cCount = 6; int a[aCount] = {1, 2, 3, 4, 5}; float b[bCount] = (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7}; char c[cCount] = HELLO ; шестая позиция для нулевого указателя cout Массив а содержит: endl; printArray(а, aCount); шаблонная функция для целого типа cout Массив b содержит: endl; printArray(b, bCount); шаблонная функция для типа float cout Массив с содержит: endl; printArray(с, cCount); шаблонная функция для типа char return 0;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |