Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 5

Естественно встает вопрос. А нельзя ли вне зависимости от типов аргументов использовать одну функцию, но с разными версиями? При вызове такой функции компилятор находит подходящую для конкретного случая версию, в зависимости от списка аргументов, который вы передаете в функцию. Оказывается, такой механизм в С++ существует, и он носит название – перегрузка функций.

В нашем случае функции 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.