Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика. Часть 2.doc
Скачиваний:
60
Добавлен:
27.03.2015
Размер:
539.65 Кб
Скачать

Перегруженные функции

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

Предположим, вам требуется написать функцию, которая определяет максимальное значение в одномерном массиве типа double. Прототип этой функции будет иметь вид

double maxdouble (double *x, int len);

Затем возникает аналогичная задача, но для массива типа int. Вы создаете другую функцию, похожую на первую, с прототипом

Int maxint(int *X, int len);

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

В нашем случае функции maxdouble и maxint целесообразно объединить в одну перегруженную функцию max. Типами аргументов таких функций часто служат шаблоны.

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

Каждый параметр шаблона состоит из служебного слова typename, за которым следует идентификатор. В заголовке шаблона имена параметров шаблона должны быть уникальны.

Стоит упомянуть, что вместо typename можно использовать class и они полностью эквивалентны.

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

Шаблон функции max можно определить следующим образом.

template<typename T> //Заголовок шаблона. Т – параметр шаблона

T max( T *x, int len ) // Заголовок функции. *x – шаблонный параметр

{

T max=x[0];

for(int i=1;i<len;i++)

if(max<x[i])

max=x[i];

return max;

}

В заголовке шаблона этой функции объявляется единственный параметр шаблона Т как тип данных, который должен проверяться функцией 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];

return max;

}