- •2.1 Елементи концепції ооп .. 20
- •1.1 Коментарі.
- •1.2 Прототипи функцій.
- •1.3 Операція розширення області видимості.
- •1.4 Оголошення в операторах.
- •1.5 Перегрузка функцій.
- •1.6 Значення формальних параметрів по замовчуванню.
- •1.7 Посилання та вказівники.
- •1.8 Специфікатор inline
- •1.9 Операції new та delete .
- •1.10 Вказівник на void.
- •1.11 Зв’язування із збереженням типів
- •1.12 Про структури та об’єднання.
- •2.1 Елементи концепції ооп.
- •2.3 Опис протоколу класу.
- •2.4 Передача повідомлень об’єктам.
- •3 Функції-члени.
- •3.1 Функції-члени в межах та за межами формального опису класу.
- •3.2 Про вказівник this.
- •3.3 Перевантаження функцій-членів. Параметри по замовчуванню.
- •4. Конструктори та деструктори.
- •4.1 Поняття про конструктори.
- •4.2 Деструктори.
- •4.3 Досягнення високої ефективності. Конструктор копіювання.
- •5 Глобальні та локальні об’єкти.
- •6 Статична пам’ять та класи.
- •7. Наслідування
- •7.1 Синтаксична реалізація наслідування
- •7.2 Правила доступу до полів даних
- •7.3 Конструктори та деструктори в похідних класах
- •7.4 Використання заміщуючих функцій-членів.
- •7.5 Похідні класи та вказівники.
- •7.6 Ієрархія типів
- •7.7 Множинне наслідування
- •8 Вiртуальнi функцiї та класи
- •8.1 Віртуальні функції.
- •8.2 Чисті віртуальні функції. Абстрактні класи.
- •8.3 Віртуальні деструктори.
- •8.4 Посилання як засіб для реалізації поліморфізму
- •8.5 Технічна реалізація механізму віртуальних функцій.
- •8.6 Віртуальні базові класи
- •8.6.1 Ієрархії класів та наслідування
- •8.6.2 Віртуальні базові класи
- •8.6.3 Виклик конструкторів та віртуальні базові класи.
- •9 Друзі
- •9.1 Дружні класи.
- •9.2 Дружні функції.
- •10 Перевантаження операторiв.
- •10.1 Перевантаження операторів. Загальний підхід.
- •10.2 Перетворення типів.
- •10.3 Перевантаження деяких операторів.
- •10.3.1 Оператор індексування масиву.
- •10.3.2 Перевантаження оператора виклику функції.
- •10.3.3 Оператор доступу до члена класу.
- •10.3.4 Перевантаження операторів інкремента та декремента.
- •10.3.5 Перевантаження операторів управління пам’яттю (new,delete).
- •10.3.6 Перевантаження оператора присвоювання.
- •11.1 Функціональні шаблони
- •11.1.1 Визначення та використання шаблонів функцiй.
- •11.1.2 Перевантаження шаблонiв функцiї.
- •11.1.3 Cпецiалiзованi функцiї шаблона.
- •11.2 Шаблони класів.
- •11.2.1 Визначення шаблонів класу
- •11.2.2 Константи та типи як параметри шаблону
- •11.2.3 Використання шаблонних класів
- •11.2.4 Спецiалiзацiя шаблонiв класу.
- •11.3 Шаблони та конфiгурацiя компiлятора.
- •11.3.1 Шаблони Smart.
- •11.3.2 Шаблони Global I External.
- •12.2 Переадресація вводу-виводу
- •12.3 Розширення потоків для типів кориcтувача
- •12.4 Операції роботи з потоком як дружні
- •12.5 Форматований ввід-вивід
- •12.5.1 Ширина поля
- •12.5.2 Заповнюючий символ
- •12.5.3 Число цифр дійсних чисел
- •12.5.4 Прапорці форматування
- •12.5.5 Маніпулятори
- •12.6 Стан потоку
- •12.7 Файловий ввід-вивід
- •12.7.1 Конструктори файлових потокiв
- •12.7.2 Вiдкриття файлу
- •12.8 Неформатований ввід-вивід
- •12.9 Деякі функції вводу-виводу
- •12.10 Форматування в пам’яті
- •13 Управління виключеннями
- •13.1 Виключення та стек
- •13.2.1 Синтаксис основних конструкцій
- •13.2.1.1 Використання try та сatch
- •13.2.1.2 Використання throw
- •13.2.2 Тип виключення та конструктор копії
- •13.2.3 Пошук відповідного типу виключення
- •13.2.4 Використання terminate() та некеровані виключення
- •13.2.5 Робота з специфікаціями виключень
- •13.2.6 Робота з непередбаченими виключеннями
- •13.2.7 Робота з конструкторами та виключеннями
- •13.2.8 Динамічні об’єкти
- •13.2.9 Передача значень з конструктора та деструктора
- •13.2.10 Робота з ієрархіями виключень
- •13.2.11 Робота з специфічними класами виключень
- •13.3 Структурне управління виключеннями
- •13.3.1 Використання кадрованого управління виключеннями
- •13.3.1.1 Синтаксис
- •13.3.1.2 Про функцію RaiseException()
- •13.3.1.3 Фільтруючий вираз
- •13.3.1.4 Перехоплення виключення процесора
- •13.3.2 Використання завершуючих обробників виключень
11.1 Функціональні шаблони
11.1.1 Визначення та використання шаблонів функцiй.
Шаблон функцiї - це узагальнене визначення, з якого компiлятор може
автоматично генерувати код (створити представника) функцiї. Синтаксис шаблона функцiї має наступний вигляд:
template <список_аргументiв_шаблона>
тип_результату iм'я_функцiї (параметри ...)
{
// Тiло функцiї
}
За ключовим словом template слiдує один чи декiлька аргументiв, якi помiщенi в дужки i вiдокремленi один вiд одного комами. Кожний аргумент складається з ключового слова class та iдентефiкатора, який визначає тип. Потiм iде визначення функцiї.
Приклади:
template <class T>
void func( T t )
{
// тiло функцiї
}
template <class T>
void func_1( T t1, T t2 )
{
// тiло функцiї
}
template <class T1, class T2>
void func_2( T1 t1, T2 t2 )
{
// тiло функцiї
}
Розглянемо, наприклад, програму сортування елементів масиву. Використовуючи шаблон функцiї, можна написати програму сортування масиву будь-якого типу.
Приклад:
#if !defined(__SORTTPL_H)
#define __SORTTMPL_H
template <class T> void sort( T array[ ], size_t size )
{
for( int i=0; i<size-1; i++ )
for( int j=size-1; i<j; j-- )
if ( array[j-1] > array[j] )
{
T tmp =array[j];
array[j] =array[j-1];
array[j-1] =tmp;
}
}
#endif // __SORTTMPL_H
Можна створити прототип шаблона функцiї у виглядi його попереднього
оголошення.
template <class T> void sort( T array[ ], size_t size );
Пiсля визначення шаблону функцiї можна зразу її викликати:
компiлятор автоматично створить представик тiла функцiї для викликiв, де конкретизуються параметри.
#include <iostream.h>
#include "sorttmp1.h" //містить шаблон функцiї sort
int main (void )
{
int iarray[ ] = { 30, 27, 45, 10, 23, 7, 4, 89 };
sort( iarray, sizeof( iarray )/sizeof( iarray[0] ) );
for (int i=0; i< sizeof( iarray)/sizeof(iarray[0] ); i++)
cout << "iarray[" << i <<"]="<< iarray[i]<< end1;
return 0;
}
Шаблон sort можна використовувати i для класiв користувача, якщо клас
перегружає операцiю '>' , яку використовують в шаблонi для порiвняння
елементiв.
Приклад:
class Amount
{
long dollars;
int cents;
public:
Amount( long _d, int_c )
{
dollars =_d;
cents =_c;
}
int operator > (const Amount& ) const;
friend ostream& operator << ( ostream&, Amount& );
};
int Amount::operator > ( const Amount& _amt )
{
return ( dollars > _amt.dollars ) ||
( dollars == _amt.dollars &&
cents > _amt.cents );
}
ostream operator << ( ostream& os, Amount &_amt )
{
os << "$" << _amt.dollars << '.' << _amt.cents;
return os;
}
int main( void )
{
Amount amtArray[ ] = {
Amount( 19, 10 ),
Amount( 99, 99 ),
Amount( 99, 95 ),
Amount( 19, 95 ),
};
sort( amtArray, sizeof( amtArray )/sizeof( amtAarray[0] ) );
for (int i=0; i< sizeof( amtArray )/sizeof( amtArray[0] ); i++)
cout << "amtArray[" << i << "] = " << amtArray[i]<< end1;
return 0;
}
Шаблон функцiї є визначенням, з якого компiлятор може створювати
функцiї. Функцiї, створенi по шаблону, називають iнодi функцiями шаблону або шаблонними функцiями.