Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

13.2. Перевантаження конструкторів

Незважаючи на те, що конструктори призначені для виконання унікальних дій, проте вони не надто відрізняються від функцій інших типів і також можуть піддаватися перевантаженню. Щоб перевантажувати конструктор класу, достатньо оголосити його в усіх потрібних форматах і визначити кожну дію, пов'язану з відповідним форматом. Наприклад, у наведеному нижче коді програми оголошено клас timerClass, який діє як таймер зворотного відліку. Під час створення об'єкта типу timerClass таймеру присвоюється деяке початкове значення часу. Під час виклику функції run(), таймер виконує відлік часу у зворотному порядку до нуля, а потім подає звуковий сигнал. У наведеному прикладі конструктор перевантажується тричі, надаючи тим самим можливість задавати час як у секундах (причому або числом, або рядком), так і в хвилинах і секундах (за допомогою двох цілочисельних значень). У цій програмі використовується стандартна бібліотечна функція clock(), яка повертає кількість сигналів, прийнятих від системного годинника з моменту початку виконання програми. Ось як виглядає прототип цієї функції:

clock_t clock();

Тип clock_t є різновидом довгого цілочисельного типу. Операція ділення значення, що повертається функцією clock(), на значення CLOCKS_PER_SEC дає змогу перетворити отриманий результат в секунди. Як прототип для функції clock(), так і визначення константи CLOCKS_PER_SEC належать заголовку <ctime>.

Код програми 13.4. Демонстрація механізму використання перевантажених конструкторів

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

#include <ctime> // Для використання системного часу і дати

using namespace std; // Використання стандартного простору імен

class timerClass { // Оголошення класового типу

int seconds;

public:

// Задавання секунд у вигляді рядка

timerClass(char *t) { seconds = atoi(t);}

// Задавання секунд у вигляді цілого числа

timerClass(int t) { seconds = t;}

// Час, що задається в хвилинах і секундах

timerClass(int xv, int sec) { seconds = xv*60 + sec;}

// Час, що задається в годинах, хвилинах і секундах

timerClass(int hod, int xv, int sec)

{ seconds = 60*(hod*60 + xv) + sec;}

void run_timer(); // Таймер відліку часу

};

void timerClass::run_timer()

{

clock_t t1;

t1 = clock();

while((clock()/CLOCKS_PER_SEC – t1/CLOCKS_PER_SEC)< seconds);

cout << "\a"; // Подання звукового сигналу

}

int main()

{

timerClass A_ob(10), B_ob("20"), C_ob(1, 10), D_ob(0, 2, 8);

A_ob.run_timer(); // Відлік 10 секунд

B_ob.run_timer(); // Відлік 20 секунд

C_ob.run_timer(); // Відлік 1 хвилини і 10 секунд

D_ob.run_timer(); // відлік 0 годин 2 хвилини і 8 секунд

getch(); return 0;

}

Під час створення у функції main() об'єктів A_ob, B_ob, C_ob i D_ob класу timerClass він надає члену даних seconds початкові значення чотирма різними способами, що підтримуються перевантаженими функціями конструкторів. У кожному випадку викликається той конструктор, який відповідає заданому переліку параметрів, і тому належним чином ініціалізує "свій" об'єкт.

На прикладі попередньої програми нам, можливо, не вдалося оцінили значущість перевантаження функцій конструктора, оскільки тут можна було обійтися єдиним способом задавання тимчасового інтервалу. Але якби ми створювали бібліотеку класів на замовлення, то нам варто було б передбачити набір конструкторів, що охоплює найширший спектр різних форматів ініціалізації, тим самим забезпечити інших програмістів найбільш придатними для їх програм форматами. Окрім того, як буде показано далі, у мові C++ існує атрибут, який робить перевантажені конструктори особливо цінним засобом ініціалізації членів-даних об'єктів.