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

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. Реалізувати тип хеш-таблиці з попереднього завдання з використаннямструктури бінарного дерева без зміни функцій вставки, перекодування та видалення.