|
Программирование >> Программирование на языке c++
Глобальная функция описывается за пределами классов. Рассмотрим пример такой функции, которая возвращает максимальное значение одного из двух параметров, переданных ей в виде аргументов. #inclucle <iostream.h> template <class Туре> Type max(Type x.Type y) { return {x>y)?x:y; } void main{void) { int a=1,b=2; char c=9,d=A; float e=123.76543,f=123; cout integer max = max(a,b) endl; cout character max = max{c,d) endl; cout float max = max{e,f) endl; Рассмотрим выражение template <class Type> Type max(Type x,Type y) Здесь описывается функция max, которая имеет два аргумента типа Туре и возвращает значение типа Туре. Сам тип Туре задан как параметр для этой функции с помощью выражения: template <class Туре>. Вызов функции max(a,b) в приведенной программе, где а и b - целые числа, приводит к тому, что используется версия этой функции для целых чисел, т. е. int max(int,int). Другой вызов, например, max(c,d), где end - символы, приводит к тому, что используется версия функции для символов, т. е. char max(char,char), и т. п. Результаты работы этой программы представятся в виде: integer max = 2 character max = A float max = 123.765 Таким образом, при каждом вызове функции max анализируются типы ее аргументов и выбирается нужная функция, в теле которой используются аргументы соответствующих типов. Когда мы записываем выражение template <class Туре>, мы требуем, чтобы описываемая далее функция использовала тип Туре в виде ее дополнительного параметра. Все операции в теле функции (в примере в теле функции max) должны быть определены для тех типов, которые передаются в функцию. Предположим, мы хотим выполнить сравнение строк так же, как это делает библиотечная функция strcmp. Однако используемое в теле нашей функции шах выражение (х>у)?х:у будет в этом случае давать неправильные результаты. Пусть, например, X и у - указатели на строки, и x= Aveiro , y= Aveir . При этом результат выражения (х>у)?х:у не будет являться указателем на большую строку, В то же время мы можем явным образом описать соответствующие операции, например: char *max(char* x.char* у) { return{strcmp(x,y)>0)?x:y; } Теперь следующая программа будет давать правильные результаты и для строк: #include <iostream.h> #include <string.h> template <class Type> Typemax(Type x.Type y) { return (x>y)?x:y; } char *max(char* x,char* y) { return(strcmp(x,y)>0)?x:y; } void main(void) { int a=1,b=.2; char c=9,d=A; float e=123.76543,f=123; char str1[]= Aveiro , str2[]= Aveir ; cout integer max = << max(a,b) endl; cout character max = max(c,d) endl; cout float max = max(e,f) endl; cout << string max = max(str1,str2) endl; Результаты работы этой программы представятся в виде: integer max = 2 character max = A float max = 123.765 string max = Aveiro Таким образом, с помощью шаблона (template) функции мы можем передать в функцию типы используемых в ней данных и классов. Далее мы можем выполнять операции над объектами заданных типов. Для некоторых объектов такие операции могут быть не определены, либо могут давать неправильные результаты (не те результаты, которые мы ожидаем). Однако для таких типов мы можем ввести явное описание функции (см. пример с функцией char* max(char* х, char* у)). Каждый аргумент шаблона функции должен определять тип как минимум одного аргумента этой функции. Это гарантирует, что нужный вариант функции будет выбран на основании анализа типов ее аргументов. Так, из приведенных ниже примеров первый и второй являются правильными, а третий и четвертый - ошибочными: template<ciass Туре> void f 1(Туре); нет ошибки tempiate<class Type,class А> char f2(Type*,int,A); нет ошибки template<class Туре> Туре f3(long); ошибка template<class Type,class А> А f4(Type); ошибка Эти ограничения не распространяются на шаблоны для классов. Рассмотрим примеры. Первый пример: #include <iostream.h> #include <string.h> template <class T> class STACK { T *top,*sp; int size; public: STACK(int n) { top = sp = new T[size=n]; } -STACKO { delete[] top; } void operator+=(T v) { if (size > sp-top) *sp++ = v; else cerr ERROR\n ; } T operator-O { if(sp==top) { cerr error:\t ; return *sp;} return *-sp; } void operator~() const { cout size = (sp-top) endl; }
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |