
- •Процедурно-орієнтоване програмування Організація підпрограм Поняття підпрограми
- •Організація підпрограм
- •Механізм передачі параметрів
- •Принцип локалізації
- •Концепція розподілу пам’яті
- •Способи передачі параметрів
- •Вказівники на функції
- •Розширені можливості використання підпрограм Функції з аргументами за замовчуванням
- •Перевантаження функцій
- •Шаблони функцій
- •Вбудовані функції
- •Рекурсія
Шаблони функцій
У випадку, коли перевантажені функції відрізняються лише використовуваним типом даних, можна уникнути рутинної роботи по їх визначенню, задавши для них шаблон. Такий спосіб визначення функцій отримав назву механізму шаблонів функцій.
Формат оголошення шаблону функцій.
template <typename T>
T ім’я_функції(Т ім’я_параметру, …)
{ … }
template <class T>
T ім’я_функції(Т ім’я_параметру, … )
{ … }
Тут typename (class) - параметр шаблона, Т — ідентифікатор формального типу.
Оголошення шаблону починається з ключового слова template. В кутових дужках <> записують список формальних типів параметрів шаблона. Кожний формальний тип параметрів складається з ключових слів typename або class, після яких слідує ідентифікатор типу. В даному прикладі це Т. Ідентифікатор, що записаний після слів typename або class, — це стандартний вбудований тип або тип користувача. Визначення функції записують після списку формальних типів параметрів шаблона.
Отже, оголошення єдиного шаблона визначає ціле сімейство функцій, параметром яких є сам тип даних.
Шаблон функції — це насправді не функція, оскільки вона не приводить до створення програмного коду в пам’яті. Це просто трафарет для створення множини функцій з одного оголошення. Генерація коду не відбуватиметься доти, доки функція не буде реально викликана під час виконання програми. При цьому аргументи конкретних типів, що передаються в шаблонну функцію під час її виклику, вказують компілятору генерувати відповідний до переданих типів код.
Наприклад, програма для визначення найбільшого з двох чисел.
int n, m, maxi;
char cn, cm, cmaxi;
double dn, dm, dmaxi;
// ======== шаблон функції визначення максимального значення ========
template <typename T>
T MAX(T a,T b)
{ if (a>b) return a; else return b;
}
//========== головна функція =============================
int main()
{ cout<<"enter two integer numbers"<<endl; cin>>n>>m;
maxi=MAX(n,m);
cout<<"max="<<maxi<<endl;
cout<<"enter two double numbers"<<endl; cin>>dn>>dm;
dmaxi=MAX(dn,dm);
cout<<"max="<<dmaxi <<endl;
cout<<"enter two char symbol"<<endl; cin>>cn>>cm;
cmaxi=MAX(cn,cm);
cout<<"max="<<cmaxi<<endl;
system("pause");
}
Для першого виклику MAX(n, m) транслятор створить функцію MAX(int, int), замінивши в тілі шаблону тип-параметр T реальним типом int, при другому виклику MAX(dn,dm) – буде створено функцію MAX(double, double), а при третьому - функцію MAX(char , char).
Результати роботи програми:
Шаблонуможнавказатине одинпараметр-тип,адекілька.Наприклад,шаблон, якийбудестворюватифункції, що знаходять аргументз типомбільшого розміру,іповертаютьцейрозмірубайтах:
template < typename T1, typename T2>
int MAXSIZE(T1 a, T2 b)
{ int size_a = sizeof(a);
int size_b = sizeof(b);
return size_a>size_b ? size_a : size_b;
}
Вбудовані функції
Використання функцій приводить до економії оперативної пам’яті, яку займає код, але збільшує час виконання програми.
Якщо функція має невеликий код, то в цьому випадку виграш від економії пам’яті буде незначний. Тому такі функції часто вбудовують у виконавчий код програми, що зменшує час виконання програми.
Функції, виконавчий код яких вбудовується у виконавчий код програми під час компіляції, називаються вбудованими або inline-функціями. Такі функції оголошуються із специфікатором inline:
inline тип ім’я(оголошення_параметрів)
{ оператори }
Специфікатор inline може ігноруватися компілятором, якщо функція має довгий код, є складною за алгоритмом, містить оператори розгалуження, циклу, вибору. Як правило, код inline- функцій обмежується операторами присвоєння чи повернення (return).