
- •Передмова
- •Розділ 1 об'єктний підхід у програмуванні
- •1.1.Причини виникнення ооп
- •1.1.1.Складність об'єкта дослідження
- •1.1.2.Складність процесу розробки програмного забезпечення
- •1.1.3.Складність опису окремих елементів
- •1.2.Парадигма ооп
- •1.3.Історія розвитку ооп
- •Розділ 2 об'єкти й класи: інкапсуляція
- •2.1.Структура об'єкта й класу
- •2.2.Особливості опису класів у мовах ооп
- •2.2.1.Опис класів в SmallTalk
- •2.2.3.Опис класів в Delphi
- •2.2.4.Опис класів в Java
- •2.3.Поля даних та їх ініціалізація
- •2.3.1.Визначення полів даних в SmallTalk
- •2.3.3.Визначення полів даних в Delphi
- •2.3.4.Визначення змінних в Java
- •2.4.Доступ до даних
- •2.4.1.Доступ до даних в SmallTalk
- •2.4.3.Доступ до даних в Delphi
- •2.4.4.Доступ до даних в Java
- •2.5.Спеціальні змінні
- •2.5.1.Спеціальні змінні в SmallTalk
- •2.5.3.Спеціальні змінні в Java
- •2.5.4.Спеціальні змінні в Delphi
- •2.6.Посилання
- •2.6.1.Визначення посилань в SmallTalk, Delphi і Java
- •2.7.Методи
- •2.7.1.Загальна схема визначення методу
- •2.7.2.Визначення методів в SmallTalk
- •2.7.4.Визначення методів в Delphi
- •2.7.5.Визначення методів в Java
- •2.8."Дружні" методи
- •2.8.2.Аналог дружніх функцій в Delphi
- •2.9.Конструктори й деструктори
- •2.9.1.Конструктори й деструктори в SmallTalk
- •2.9.3.Конструктори й деструктори в Delphi
- •2.9.4.Конструктори й деструктори в Java
- •2.10.Властивості
- •2.10.1.Властивості в Delphi
- •2.10.2.Властивості в Java
- •2.12.Абстрактні методи
- •Розділ 3 успадкування
- •3.1.Форми успадкування
- •3.2.Успадкування в SmallTalk
- •3.3.1.Віртуальне успадкування
- •3.3.2.Правило сумісності типів
- •3.3.3.Використання конструкторів і деструкторів при успадкуванні
- •3.4.Успадкування в Delphi
- •3.4.1.Ієрархія класів в Delphi
- •3.4.2.Створення нових компонентів
- •3.5.Успадкування в Java
- •3.5.1.Використання ключового слова super
- •3.5.2.Клас Object
- •Розділ 4 поліморфізм
- •4.1.Віртуальні методи
- •4.2.1.Механізм пізнього зв'язування
- •4.2.2.Таблиця віртуальних методів
- •4.3.Поліморфізм в Delphi
- •4.3.1.Заміщення віртуальних і динамічних методів
- •4.3.2.Приведення типів
- •4.4.Поліморфізм в Java
- •4.5.Поліморфізм в SmallTalk
- •5.1.Потокові класи
- •5.1.1.Ієрархія потокових класів
- •5.1.2.Форматоване введення/ виведення
- •5.1.3.Маніпулятори
- •5.1.4.Введення/виведення у файл
- •5.2.Контейнерні класи
- •5.2.1.Ітератори
- •5.2.2.Визначення контейнерних класів
- •5.2.3.Стандартні контейнерні класи
- •5.3.1.Параметиізовані класи (шаблони)
- •5.3.2.Ітератори stl
- •5.3.3.Узагальнені алгоритми
- •Література
- •Додатки лабораторна робота №1 об'єкти й повідомлення в smalltalk
- •Лабораторна робота №2 класи й методи в smalltalk
- •Листинг 3.1
- •Листинг 3.2
- •Листинг 3.3
- •Лабораторна робота 5 компоненти в delphi
- •Лабораторна робота 6 меню й вікна в delphi
- •Лабораторна робота 7 розробка меню в java
- •Лабораторна робота 8 робота з подіями в java
5.1.Потокові класи
5.1.1.Ієрархія потокових класів
Ціль потоків – уніфікація операцій вводу-висновку. Засоби введення/видачі даних не входять безпосередньо в мову С++, тому бібліотека введення/виведення є однієї із самих незамінних при програмуванні на С++. Вона забезпечує програміста механізмами для витягу даних з потоків і для включення (приміщення) даних у потоки.
Потік - це абстрактне поняття, що відноситься до будь-якого перенесення даних від джерела до приймача. Потік визначається як послідовність байтів (символів) і з погляду програми не залежить від пристроїв, з якими ведеться обмін даними (файл на диску, принтер, клавіатура, дисплей і т.п.).
При обміні з потоком часто використовується допоміжна ділянка основної пам'яті - буфер потоку. У буфер потоку подаються виведені програмою дані перед тим, як вони будуть передані зовнішньому пристрою. При введенні даних вони спочатку містяться в буфер і тільки потім передаються в область пам'яті виконуваної програми. Використання буфера підвищує швидкість передачі даних, тому що реальні пересилання здійснюються тільки тоді, коли буфер уже заповнений (при виведенні) або порожній (при введенні).
Для використання потокових класів, необхідно включити в програму потрібний заголовний файл: iostream.h - для класів ios, istream, ostream, stream; fstream.h - для класів ifstream, ofstream, fstream. Ієрархія класів С++, що зв'язують дані класи, представлена на рис. 5.1. У назві файлів і класів використовується наступні скорочення: stream - потік, "i" - input (введення), "o" – output (виведення), "f" – файл.
Рис. 5.1. Ієрархія потокових класів у С++
Клас ios є базовим для всіх потокових класів. Він забезпечує інтерфейс із класом streambuf, що визначає загальні правила буферізації й обробки потоків, коли не потрібно значного форматування. Клас istream забезпечує введення зі стандартного пристрою й містить перевантажений оператор форматованого введення >>. Клас ostream забезпечує видачу на стандартний пристрій містить перевантажений оператор форматованого виведення <<. Клас iostream сполучає попередні два класи й забезпечує використання одного потоку у двох напрямках.
5.1.2.Форматоване введення/ виведення
Всі програми на С++, що включають заголовний файл iostream.h, містять чотири визначених потоки (об'єкти відповідних класів), які створюються до початку виконання функції main() і закриваються вже після її завершення:
cin – стандартне введення;
cout – стандартне виведення;
cerr –видача у стандартний потік помилок;
clog – буферізоване виведення у стандартний потік помилок.
Приклад використання потоку стандартного виведення виглядає в такий спосіб:
cout << “Hello”;
Операції стандартного введення/виведення асоціативні, тому допускається така конструкція:
cout << “i = “ << i << “ j = “ << j;
У результаті буде виведений наступний рядок (при i=3, j=5):
i = 3 j = 5
Форматування введення/ виведення задається за допомогою спеціальної функції ios::setf(long), що має наступні визначені значення параметра:
skipws – пропуск пустих символів при введенні;
left – виведення з вирівнюванням по лівому краї;
right – виведення з вирівнюванням по правому краї;
dec – виведення з десятковому форматі;
oct – виведення з восьмеричному форматі;
hex – виведення у шістнадцятирічному форматі;
uppercase – верхні символи;
showpos – показувати знак “+” для позитивних чисел;
scientific – виведення в експонентній формі;
fixed – виведення чисел із двома знаками після коми.
Приклад використання форматованого виведення наведений нижче:
cout.setf(ios::hex);
Виконання методу форматування для об'єкта введення/ виведення аналогічне установці відповідного прапора форматування, що діє до чергової установки прапора.
Для завдання ширини поля виведення використовується функція ios::width(int):
cout.width(4);
Якщо кількість зазначених символів не вистачає, то параметр відкидається й приймається рівним нулю. Після кожної форматованої вставки ширина поля встановлюється в нуль:
cout.width(4); // ширина поля дорівнює 4
cout << i << “ ” << j; //ширина поля дорівнює 0
За замовчуванням параметр дорівнює нулю, що відповідає ширині поля виведеного повідомлення.