- •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 Використання завершуючих обробників виключень
3.3 Перевантаження функцій-членів. Параметри по замовчуванню.
Функції - члени класу можна перевантажувати. Механізм перевантаження функцій-членів класу аналогічний механізму перевантаження “звичайних” функцій. За допомогою перевантажених функцій можна створювати надзвичайно гнучке програмне забезпечення. Адже ми можемо передбачити реалізації якоїсь функції “на всі випадки життя”. Розглянемо, наприклад, вже згаданий раніше клас Ttime. Очевидно, що нам знадобляться якісь функції встановлення дати та часу. Проте, можна уявити собі ситуацію, коли нас цікавить лише час, а дата не цікавить взагалі або навпаки. Тому можемо написати кілька функцій з різними сигнатурами та діями, передбачивши різні ситуації:
class TTime {
private:
int year;
int month;
int day;
int hour;
int minute;
public:
void Display (void);
void SetTime(int phour, int pminute);
void SetTime(int ,int , int );
};
void TTime::Display (void)
{printf ("year=%d month=%d day=%d hour=%d \
minute=%d \n", p--> year, p--> month, p--> day,\
p--> hour ,p--> minute);}
void TTime::SetTime(int pyear,int pmonth, int pday)
{year=pyear;
month=pmonth;
day=pday;}
void TTime::SetTime(int phour, int pminute)
{hour=phour;
minute=pminute; }
Перевантаження функцій є єфективним механізмом у випадках, коли реалізації перевантажених функцій принципово різні. В нашому ж прикладі можна легко обійтись без перевантаження функцій, використовуючи параметри по замовчуванню. Дійсно, писати свою функцію для кожного випадку ініціалізації полів даних класу Ttime було б дуже нераціонально. Теоретично можлива кількість таких фукнкцій, якщо підійти до цього питання чисто формально, - 32 . В рамках правил перегрузки функцій дупускається ж лише 5. Якщо б ми захотіли змоделювати всі ці ситуації за допомогою механізму параметрів по замовчуванню, то теоретично необхідно було б 5!=120 (для кожного розміщення параметрів -по одній) функцій-членів класу виду:
void TTime::SetTime (int pyear=0, int pmonth=0; int pday=0,\
int phour=0,int pminute=0;)
{ year=pyear;
month=pmonth;
day=pday;
hour=pour;
minute=pminute;}
Це випливає з правил передачі параметрів по замовчуванню. Проте копілятор “пропустить” лише одну таку функцію. Очевидно, що всі 6 допустимих варіантів перегружених функцій з прототипами SetTime(),SetTime(int), SetTime(int ,int), SetTime(int,int,int ), SetTime(int ,int,int,int), SetTime(int,int,int,int,int ) можна замітити однією з параметрами по замовчуванню, якщо підібрати спеціально розміщення цих параметрів (щоб ініціалізувались відповідні поля). З цього прикладу бачимо, що механізм передачі параметрів по замовчуванню в нашому елементарному прикладі не може повністю замінити перегрузку функцій. Звичайно, що це не стосується загального випадку. Адже реалізація кожної перегруженої функції може бути різною і їх ніяк не можна замінити однією з параметрами по замовчуванню з виграшем у розмірі програми (розмір варіанту з параметрами по замовчуванню принаймні буде мати один порядку з сумарним розміром перегружених функцій).
Контрольні запитання
1. Як синтаксично реалізується опис функції-члена за межами формального опису класу?
2. В чому відмінність між описом функції в межах і за межами формального опису класу?
3. Для чого введений вказівник this? Навести приклади його використання.
4. Чи можна перевантажувати функції-члени?
5. Чи можна використовувати параметри по замовчуванню у функціях-членах ?
6.Чи буде працювати функція-член об’єкта, яка знищує сам об’єкт ?
Завдання 3:
1. Написати функції вставки та видалення елемента в
а) однозв’язному списку
б) двозв’язному списку
в) бінарному дереві
Використати вказівник this.
2. Утворити клас з перегруженими функціями-членами розв’язку СЛАР різними методами
3. Описати клас Draw , який містить кілька функцій, що малюють різні геометричні фігури. Використати його в програмі.
4. Описати клас Complex , який містить набір функцій, що виконують різні дії з комплексними числами.
5. Описати клас Орієнтований граф з набором методів роботи з ним.
6. Змінити реалізацію класу Complex так, щоб можна було використовувати полярні координати замість пар дійсна-уявна частина. Подумайте, як вплинуть ці зміни на код користувача.
7. Описати клас хеш-таблиці, який запам’ятовує та повертає записи з ключем-рядком символів. Неписати загальнодоступні функціональні елементи для вставки та видалення записів з хеш-таблиці. Деталі реалізації заховати в приватній частині класу.
8. Реалізувати тип хеш-таблиці з попереднього завдання з використаннямструктури бінарного дерева без зміни функцій вставки, перекодування та видалення.