- •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.2 Перевантаження шаблонiв функцiї.
Аналогічно, як i звичайнi функцiї, функцiональнi шаблони можуть бути перевантаженi.
Приклад:
template <class T>
T getMax( T t1, T t2 )
{
return t1 > t2 ? t1 : t2;
}
template <class T>
T getMax(T t[ ], size_t size )
{
T retVal = t[0];
for( int i=0; i<size; i++ )
if ( t[i] > retVal )
retVal = t[i];
return retVal;
}
int main( void )
{
int i1 = 3;
int i2 = 5;
int iarray[ ] = { 3, 9, 5, 8 };
cout << "max int = " << getMax( i1, i2 ) << end1;
cout << "max int = "
<< getMax(iarray, sizeof(iarray)/sizeof(iarray[0]))
<< end1;
return 0;
}
11.1.3 Cпецiалiзованi функцiї шаблона.
Спецiалiзована функцiя шаблона - це звичайна функцiя, iм'я якої спiвпадає з iменем функцiї в шаблонi, але яка визначається для параметрiв специфiчних типiв. Можна визначати спецiалiзованi функцiї шаблона для випадкiв, коли узагальнений шаблон не придатний для деякого типу даних. Наприклад, функцiя шаблона getMax не може використовуватися для рядкiв (char*, char[]), оскiльки код, який генерується компiлятором, просто буде порiвнювати їх положення в пам'ятi.
Приклад:
template <class T>
T getMax( T t1, T t2 )
{
return t1 > t2 ? t1 : t2;
}
char* getMax( char* s1, char* s2 )
{
return strcmp( s1, s2 ) > 0 ? s1 : s2;
}
int main( void )
{
int i1 = 3;
int i2 = 5;
cout << "max int = " << getMax( i1, i2 ) << end1;
char *s1 = "Golden Eagle";
char *s2 = "Peligrime Falcon";
cout << "max str = " << getMax( s1, s2 ) << end1;
return 0;
}
Коли компiлятор зустрiчає виклик функції, то виконуються наступні дії:
-знаходить функцiю (не шаблонну), параметри якої вiдповiдають вказаним у виклику.
-якщо функцiя не знайдена, знаходить шаблон, з якого можна згенерувати
функцiю з точною вiдповiднiстю параметрiв.
-якщо нiякий шаблон функцiї не забезпечує точного спiвпадання, знову
розглядаються звичайнi функцiї на предмет можливого перетворення типiв.
11.2 Шаблони класів.
11.2.1 Визначення шаблонів класу
Шаблон класу дає узагальнене визначення сiмейства класiв, що використовує довiльнi типи чи константи. Шаблон визначає елементи даних та елементи-функцiї класу. Пiсля визначення шаблона класу ми можемо вказати компiлятору на необхідність генерувати на його основi новий клас для конкретного типу чи константи. Синтаксис шаблона класу має наступний вид:
template <список_аргументiв_шаблона>
class iм'я_ класу
{
// тiло класу
};
За ключовим словом template слiдує один чи декiлька аргументiв, помiщених в дужки i вiдокремлених одне вiд одного комами. Кожний аргумент є або iм'ям типу, за яким слідує iдентифiкатор, або ключовим словом class, за яким слідує iдентифiкатор типу.
Параметри шаблону, що складаються з ключового слова class та слiдуючого за ним iдентифiкатора називають параметрами типу. Вони iнформують компiлятор про те, що шаблон пропонує тип в якостi аргумента. Параметри шаблона, що складаються з iменi типу та iдентифiкатора називаються нетиповими. Вони iнформують компiлятор про те, що в якостi аргумента виступає константа.
Приклад:
const size_t defStackSize = 10;
template <class T>
class TStack
{
public:
TStack( size_t size = defStackSize )
{
numItems = 0;
items = new T[size];
}
~TStack()
delete [ ] items;
}
void push( T t );
T pop();
protected:
int numItems;
T *items;
};
template <class T>
void TStack<T>::push( T t )
{
items[numItems++] = t;
}
template <class T>
T TStack<T>::pop()
{
return items[--numItems];
}
Як бачимо з прикладу, в даному випадку визначається шаблонний клас, у якому фігурує невідомий тип даних Т. Якщо функцiя визначається як невбудована (див. приклад), то її заголовок має такий формат:
template <список_аргументiв_шаблона>
тип_результату iм'я_класу <арг_шаблона>::iм'я_функцiї (параметри...)
{
//тiло функцiї
}
Можна використовувати ключове слово inline для визначення вбудованого методу ззовнi шаблона:
template <class Type>
inline void className <Type>::methodName( int i )
{
// тiло функцiї
}