Естественно встает вопрос. А нельзя ли вне зависимости от типов аргументов использовать одну функцию, но с разными версиями? При вызове такой функции компилятор находит подходящую для конкретного случая версию, в зависимости от списка аргументов, который вы передаете в функцию. Оказывается, такой механизм в С++ существует, и он носит название – перегрузка функций.
В нашем случае функции maxdoubleи maxint целесообразно объединить в одну перегруженную функцию max. Типами аргументов таких функций часто служат шаблоны.
Объявление и определение шаблона функции начинается ключевым словом template, за которым следует заключенный в угловые скобки и разделенный запятыми непустой список параметров шаблона. Эта часть объявления или определения обычно называется заголовком шаблона.
Каждый параметр шаблона состоит из служебного слова typename, за которым следует идентификатор. В заголовке шаблона имена параметров шаблона должны быть уникальны.
Стоит упомянуть, что вместо typenameможно использовать classи они полностью эквивалентны.
Следом за заголовком шаблона располагается прототип или определение функции – все зависит от контекста программы. Как известно, у прототипа и определения функции также имеется собственный заголовок. Этот заголовок состоит из типа возвращаемого значения, имя функции и списка параметров. В этом списке они играют роль спецификаторов типа. Объявления параметров, у которых в качестве спецификатора типа используется идентификатор из списка параметров шаблона, называется шаблонным параметром. Наряду с шаблонными параметрами в список параметров функции могут также входить параметры основных и производных типов.
Шаблон функции max можно определить следующим образом.
template<typename T> //Заголовок шаблона. Т – параметр шаблона
Tmax(T *x, intlen) // Заголовок функции. *x – шаблонный параметр
{
T max=x[0];
for(int i=1;i<len;i++)
if(max<x[i])
max=x[i];
returnmax;
}
В заголовке шаблона этой функции объявляется единственный параметр шаблона Ткак тип данных, который должен проверяться функцией max. В следующем далее заголовке функции этот параметр Tиспользован для задания типа возвращаемого значения (T max) и для задания типа указателя x. В теле функции этот же параметр Tиспользован для указания типа локальной переменной max.
В приведенном ниже примере показано использование шаблона функции max для решения поставленной задачи.
#include <iostream>
using namespace std;
//Шаблон функции для поиска максимального элемента
template<typename T> T max(T *x,int len)
{…………… }
void main(void)
{ int small[] ={1,24,34,22,33};
double large[] = {23.0, 1.4,2.456,345.5,12.0,2981.1};
int lensmall(sizeof small/sizeof small[0]);// Определение
// количества элементов в массивах
int lenlarge(sizeof large/sizeof large[0]);
cout<<max(small,lensmall)<<endl;
cout<<max(large,lenlarge)<<endl;
}
Результат
34
2981.1
Когда компилятор обнаруживает вызов функции maxв исходном коде программы, то тип данных, переданных в функцию, подставляется всюду вместо Т в определении шаблона и C++ создает законченную функцию для определения максимального значения в одномерном массиве. Затем эта созданная функция компилируется.
Например, при вызове функции max для целочисленного массива small[] компилятор сгенерирует функцию:
int max( int *x, int len )
{ int max=x[0];
for(int i=1;i<len;i++)
if(max<x[i])
max=x[i];
returnmax;
}
В обучающих задачах с массивами часто возникает необходимость заполнять эти массивы случайными числами. Наиболее просто это можно решить с помощью функции rand, ее прототип:
int rand (void);
Она генерирует псевдослучайное целое число на интервале значений от 0 до RAND_MAX. Последнее является константой, которая варьируется в зависимости от реализации языка, но в большинстве случаев составляет 32767.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.