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

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

};

Void timerClass::Run()

{

clock_t t1 = clock();

while((clock()/CLOCKS_PER_SEC - t1/CLOCKS_PER_SEC)< s); cout«"\a"; // Подання звукового сигналу

Int mainO

{

timerClass ObjA(IO), ObjB("20"), 0bjC(1,10), ObjDfO, 2,8);

ObjA.RunO; // Відлік 10 секунд ObjB.RunO; // Відлік 20 секунд ObjC.Run(); // Відлік 1 хвилини і 10 секунд ObjD.RunO; // відлік 0 годин 2 хвилини і 8 секунд

getchO; return 0;

}

При створенні у функції mainO об'єктів ObjA, ObjB, ObjC і ObjD класу timerClass він

надає члену даних s початкові значення чотирма різними способами, що підтри­муються перевизначеними функціями конструкторів. У кожному випадку викли­кається той конструктор, який відповідає заданому переліку параметрів, і тому правильно ініціалізує "свій" об'єкт.

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

  1. Особливості механізму динамічної ініціалізації конструктора

У мові програмування C++ як локальні, так і глобальні змінні можна ініціалі- зувати у процесі виконання програми. Цей процес іноді називають динамічною ініціалізацією. Дотепер у більшості настанов ініціалізації, що були представлені у цьому навчальному посібнику, використовувалися константи. Проте одну і ту ж саму змінну можна також ініціалізувати у процесі виконання програми, викорис­товуючи будь-який С++-вираз, дійсний на момент оголошення цієї змінної. Це оз­начає, що змінну можна ініціалізувати за допомогою інших змінних і/або викликів функцій за умови, що у момент виконання настанови оголошення загальний вираз ініціалізації має дійсне значення. Наприклад, різні варіанти ініціалізації змінних абсолютно допускаються у мові програмування C++:

int n = strlen(str);

double arc = sin(theta);

float d = 1.02 * pm/delta;

Подібно до простих змінних, об'єкти можна ініціалізувати динамічно під час їх створення. Цей механізм дає змогу створювати об'єкт потрібного типу з вико­ристанням інформації, яка стає відомою тільки у процесі виконання програми. Щоб показати, як працює механізм динамічної ініціалізації конструктора, спро­буємо модифікувати код програми реалізації таймера, який було наведено в попе­редньому розділі.

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

Наприклад, у версії коду програми таймера для створення двох об'єктів ObjB і ObjC, яку наведено нижче, використовується динамічна ініціалізація конструктора.

Код програми 3.5. Демонстрація механізму динамічної ініціалізації конструктора

#include <vcl>

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

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

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

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