Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретичний матеріал до теми.doc
Скачиваний:
1
Добавлен:
13.11.2019
Размер:
64.51 Кб
Скачать

Теоретичний матеріал до теми «Перевантаження функцій. Шаблони функцій. Покажчик на функцію. Передача масивів у функції» Перевантаження функцій

У мові С++ допускається використовувати одне і те саме ім'я функції для різних наборів аргументів (різних типів або різної кількості). Це називається перевантаженням функцій або поліморфізмом. У таких випадках необхідно кожну функцію оголосити й описати окремо. Під час її виклику компілятор автоматично проаналізує прототипи та виконає код відповідної функцій.

Увага! Для функцій, які відрізняються типом значення, яке вони повертають, і мають однаковий набір аргументів, перевантаження у мові С++ не визначено, тобто їм надавати однакові імена не можна.

Перевантаження функцій. Приклад

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

#include<iostream.h> #include<conio.h> void sort(int n1, int n2, int n3);

void sort(char n1, char n2, char n3);

int main() {int i1, i2, i3,k;

char c1, c2, c3;

cout<<“uvedit 1 dlya simvoliv, 2 – dlya chisel\n”; cin>>k; if (k==1)

{ cout<<“3 simvoli: “;

cin>>c1>>c2>>c3;

sort( c1, c2, c3); }

if (k==2)

{ cout<<“3 chisla: “;

cin>>i1>>i2>>i3;

sort( i1, i2, i3);}

getch ();return 0;}

//----------------------------------------------

void sort(int n1, int n2, int n3)

{int c;

if (n1>n2) {c=n1; n1=n2; n2=c;}

if (n2>n3) {c=n2; n2=n3; n3=c;}

if (n1>n2) {c=n1; n1=n2; n2=c;}

cout<<n1<<“\t”<<n2<<“\t|<<n3;}

//----------------------------------------------

void sort(char n1, char n2, char n3)

{char c;

if (n1>n2) {c=n1; n1=n2; n2=c;}

if (n2>n3) {c=n2; n2=n3; n3=c;}

if (n1>n2) {c=n1; n1=n2; n2=c;}

cout<<n1<<“\t”<<n2<<“\t|<<n3;}

Шаблони функцій. Основні поняття

Перевантаження функцій часто буває корисним, але не завжди зручним. Як видно з попереднього прикладу, один і той самий код довелося записувати окремо для змінних символьного типу, а потім для цілих чисел. У мові С++ є змога уникнути таке дублювання за допомогою шаблонів.

Шаблон функції – це опис функції, яка залежить від даних довільного типу. Крім того, така функція може повертати в основну програму результат довільного типу.

Під час виклику такої функції компілятор автоматично проаналізує тип фактичних аргументів, згенерує для них програмний код і виконає відповідні дії.

Такий підхід у програмуванні називається узагальненим програмуванням.

Шаблони функцій. Приклад використання

Використовуючи шаблони функцій, скласти програму для упорядкування трьох уведених даних або символьного, або цілого типу.

#include<iostream.h> #include<conio.h> // оголошення шаблона функції

template <class myType>

void sort(myType n1, myType n2, myType n3);

int main() {

int i1, i2, i3,k;

char c1, c2, c3;

cout<<“uvedit 1 dlya simvoliv, 2 – dlya chisel\n”; cin>>k; if (k==1)

{ cout<<“3 simvoli: “;

cin>>c1>>c2>>c3;

sort( c1, c2, c3); } // виклик функції

if (k==2)

{ cout<<“3 chisla: “;

cin>>i1>>i2>>i3;

sort( i1, i2, i3);} // виклик функції

getch ();return 0;

}

//----------------------------------------------

// опис шаблона функцій

template <class myType>

void sort(myType n1, myType n2, myType n3);

{

myType c;

if (n1>n2) {c=n1; n1=n2; n2=c;}

if (n2>n3) {c=n2; n2=n3; n3=c;}

if (n1>n2) {c=n1; n1=n2; n2=c;}

cout<<n1<<“\t”<<n2<<“\t|<<n3;

}

Увага! У стандарті ISO/ANSI замість ключового слова class прийнято записувати typename

Вбудовані функції. Основні поняття

Під час виконання програми генеруються коди для всіх функцій користувача. Коли відбувається звернення до тієї чи іншої функції, здійснюється виклик відповідного коду. Якщо до функції звертаються багато разів, то робота програми сповільнюється.

Щоб цього уникнути, можна використовувати вбудовані функції. Коди таких функцій вставляються компілятором у кожну точку виклику в основному коді. Це вимагає додаткового обсягу оперативної пам'яті, проте прискорює процес виконання програми.

Щоб створити вбудовану функцію, потрібно до її оголошення додати ключове слово inline

Вбудовані функції. Приклад використання

#include<iostream.h> #include<conio.h> // оголошення вбудованої функції

inline float dob( int a);

int main() {

int n=10; float D=1;

for (int k=1; k<=n; k++)

D*=dob(k);

cout<<“D= “<<D;

getch ();return 0;

}

//-------------------------------------

float dob(int a)

{

float d;

d=(5*a+2)/(a-15);

return d;

}

Результат виконання 28380.5

. Покажчик на функцію

Кожна функція характеризується типом значення, що повертається, ім'ям і списком типів її параметрів. Якщо ім'я функції використовувати без подальших дужок і параметрів, то воно виступатиме як покажчик на цю функцію, і його значенням буде адреса розміщення функції в пам'яті. Це значення можна буде присвоїти іншому покажчику. Тоді цей новий покажчик можна буде використовувати для виклику функції.

Покажчик на функцію визначається таким чином:

тип_функції(*ім’я_вказівника)(специфікація параметрів)

У визначенні покажчика кількість і тип параметрів повинні співпадати з відповідними типами у визначенні функції, на яку ставиться покажчик.

Виклик функції за допомогою покажчика має вигляд:

(*ім’я_вказівника)(список фактичних параметрів);

#include <iostream>

using namespace std;

int f1(char* S)

{

cout<<S<<"\n";

return 1;

}

void main()

{

char s[20]="\nfunction1";

int(*ptr1)(char*); //покажчик на функцію

ptr1=f1; //покажчику надається адреса функції f1

cout<<((*ptr1)(s)); //виклик функції f1 за допомогою покажчика

}

Покажчики на функції зручно використовувати в тих випадках, коли функцію треба передати в іншу функцію як параметр.

#include <iostream>

#include <math.h>

using namespace std;

typedef float(*fptr)(float);//тип-вказівник на функцію-рівняння

/*розв’язок рівняння методом половинного ділення, рівняння передається за допомогою покажчика на функцію */

float root(fptr f, float а, float b, float e)

{

float x;

do

{

x=(a+b)/2; //знаходимо середину відрізка

if ((*f)(а)*f(x)<0) //вибираємо відрізок

b=x;

else a=x;

}

while((*f)(x)>e && fabs(а-b) >e);

return x;

}

//функція, для якої шукаємо корінь

float testf(float x)

{

return x*x-1;

}

void main()

{

/*у функцію root передається покажчик на функцію, координати відрізка і точність */

float res=root(testf,0,2,0.0001);

cout<<”\nX=”<<res;

}