|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Указатели на функции. Функцию можно вызвать через указатель на нееФункцию можно вызвать через указатель на нее. Для этого объявляется указатель соответствующего типа и ему с помощью операции взятия адреса присваивается адрес функции:
тип_функции (*имя_указателя) (спецификация_параметров);
Например: int (*func1Ptr) (char); - определение указателя func1Ptr на функцию с параметром типа char, возвращающую значение типа int. Если приведенную синтаксическую конструкцию записать без первых круглых скобок, т.е. в виде int *fun (char); то компилятор воспримет ее как прототип некой функции с именем fun и параметром типа char, возвращающей значение указателя типа int *. Второй пример: char * (*func2Ptr) (char *,int); - определение указателя func2Ptr на функцию с параметрами типа указатель на char и типа int, возвращающую значение типа указатель на char. В определении указателя на функцию тип возвращаемого значения, типы, количество и последовательность параметров должны совпадать с соответствующими характеристиками тех функций, адреса которых предполагается присваивать вводимому указателю при инициализации или с помощью оператора присваивания. В качестве простейшей иллюстрации сказанного приведем программу с указателями на функциии:
#include <iostream.h> #include <conio.h> #include <math.h> float degr(double x) {return M_PI*x/180;} double in(void) {double ang; cout << "\nEnter angle in degrees:"; cin >> ang; return ang;} void main() { double (*ptr1)(void); double (*ptr2)(double); float (*ptr3)(double); ptr1=in; ptr2=cos; ptr3=degr; cout << "Cos=" << ptr2(ptr3(ptr1())); getche();}
Перегрузка функций. При определении функций в своих программах вы должны указать тип возвращаемого функцией значения, а также количество параметров и тип каждого из них. Например, если есть функция, работающая с двумя целыми значениями, то при необходимости использовать подобную функцию для трех целых значений, нужно создать функцию с другим именем. Аналогично если нужно использовать подобную функцию для сложения значений типа float, то необходима еще одна функция с еще одним именем. Чтобы избежать дублирования функции, C++ позволяет определять несколько функций с одним и тем же именем. В процессе компиляции C++ принимает во внимание количество аргументов, используемых каждой функцией, и затем вызывает именно требуемую функцию. Предоставление компилятору выбора среди нескольких функций называется перегрузкой. Перегрузка функций позволяет использовать одно и то же имя для нескольких функций с разными типами и количеством параметров. Для перегрузки функций нужно определить две функции с одним и тем же именем и типом возвращаемого значения, которые отличаются количеством параметров или их типом.
#include <iostream.h> #include <conio.h>
int adder (int iarray[]); float adder (float farray []); int main() {int iarray[7] = {5,1, 6, 20,15,0, 12}; float farray[7] = {3.3,5.2,0.05,1.49,3.12345,31.0,2.007}; int isum; float fsum; isum = adder(iarray); fsum= adder(farray); cout<< "Сумма массива целых чисел равна " << isum << "\n"; cout<< "Сумма массива дробных чисел равна " << fsum << "\n"; getche(); return (0);}
int adder(int iarray[]) {int i, ipartial = iarray[0]; for(i= 1; i < 7; i++) ipartial += iarray[i]; return(ipartial);}
float adder (float farray[]) {int i; float fpartial = farray [0]; for(i= 1; i < 7; i++) fpartial += farray[i]; return (fpartial);}
Шаблоны функций
Шаблон функции - позволяет запрограммировать нужный нам алгоритм при этом не отталкиваясь от какого-то типа данных, то есть мы создаем функцию, которой все равно работать с типом double или int. Синтаксис определения функции:
template <class идентификатор_типа> идентификатор_типа имя_функции (идентификатор_типа параметр1, идентификатор_типа параметр2, тип параметр3, …)
Пример: функция возведения суммы чисел x и y в степень n #include <iostream> #include <conio.h> #include <math.h>
template <class Type> Type st(Type x, Type y, int n) {Type z; z=pow((x+y),n); return z;}
void main() {cout << "(2.4+2.6)^2=" << st(2.4,2.6,2)<< "\n"; cout << "(2+2.5)^2=" << st(2,2.5,2)<< "\n"; cout << "(0.4+1.6)^10=" << st(0.4,1.6,10); getche();}
Вместо использования какого-то определённого типа, в функции используется параметрический тип (или аргумент шаблона). В примере параметрический тип обозначен идентификатором Type. В функции этот идентификатор встречается четыре раза: возвращаемое значение, 2 аргумента функции и определение переменной z. То есть Type используется как любой обычный тип. Основные свойства параметров шаблона: - имена параметров шаблона должны быть уникальными во всем определении шаблона; - список параметров шаблона функций не может быть пустым, так как при этом теряется возможность параметризации и шаблон функций становится обычным определением конкретной функции; - в списке параметров шаблона функций может быть несколько параметров. Каждый из них должен начинаться со служебного слова class. Например, допустим такой заголовок шаблона: template <class type1, class type2> Соответственно, неверен заголовок: template <class type1, type2, type3> - недопустимо использовать в заголовке шаблона параметры с одинаковыми именами, т.е. ошибочен такой заголовок: template <class t, class t, class t> - все параметры шаблона функций должны быть обязательно использованы в спецификациях параметров определения функции. Имя параметра шаблона (в наших примерах type1, type2 и т.д.) имеет в определяемой шаблоном функции все права имени типа, т.е. с его помощью могут специализироваться формальные параметры, определяться тип возвращаемого функцией значения и типы любых объектов, локализованных в теле функции.
Пример 2: #include <iostream.h> #include <conio.h> #include <math.h> template <class Type1, class Type2, class Type3> Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.) |