КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Параметр функции. Указатель на функцию.⇐ ПредыдущаяСтр 13 из 13 Для передачи функции в функцию пользователя необходимо уметь: 1) объявить параметр – указатель на функцию 2) внутри функции, опираясь на указатель, вызвать переданную функцию при переданном аргументе 3) вызывая функцию, передать адрес конкретной функции для соответствующего аргумента
Как объявить указатель на функцию? void (*f1)(void); // объявлена переменная f1 – указатель на тип void, не имеющую параметров. int (*f2)(int, double); // объявлена переменная f2 – указатель на тип int, имеющая два параметра: на тип int и double double (*f)(double); // объявлена переменная f – указатель на тип double, имеет один параметр типа double
Отсюда видно, что при объявлении указателя на функцию важны характеристики функции: тип функции, количество и порядок следования параметров.
Как поместить в указатель конкретное значение? В указатель на функцию можно поместить адрес конкретной функции с соответствующими характеристиками. double (*f)(double); double sin(double); f=sin; Имя конкретной функции – ее адрес.
Как вызвать функцию, опираясь на адрес? double rez=f(M_PI/2);
Написать функцию вычисления интеграла
Integral double (*f)(double); double a, double b int n
#include<iostream> using namespace std; double Integral(double (*f)(double) … ? { int i; double h=(b-a)/n, integ=0; for (i=0; i<n, i++) integ+=f(a+i*h); return h*integ; }
double func(double x) { return x*x-1; }
#include <math.h> int main(void) { double rez; rez=Integral(sin,0,3.14,10000); cout<<rez<<endl; rez=Integral(func,0,2,10000); cout<<rez<<endl; return 0; } + 41. Перегрузка функций. Удобно, когда функции, выполняющие одно и то же действие для разных типов данных, имели бы одно и то же имя. Использование нескольких функций с одним и тем же именем, но с разными списками параметров(по типу или количеству) называется перегрузкой. . Тип функции не участвует в перегрузке. Компилятор определяет, какая функция вызвана по набору аргументов. Вызов функции должен быть однозначным. Неоднозначность может возникнуть при: 1. Преобразовании типа 2. Использовании параметров ссылок 3. Использовании параметров по умолчанию
1. float f(float a); double f(double a);
int main (void) { int a =...; float b =...; double c =...; f (b); f (c); f (a); // неоднозначность. возникнет ошибка компиляции f ((double)a); // таким образом можно устранить неоднозначность return 0; }
2.
void f1(int a); void f1(int&a);
int main (void) { int a =...; f1(a); // неоднозначность return 0; }
3.
void f2 (int a); int f2 (int a, int b=3);
int main (void) { int a =...; f2(a); // неоднозначность return 0; }
|