- •Міністерство надзвичайних ситуацій України Львівський державний університет безпеки життєдіяльності Юрій грицюк, Тарас рак
- •Навчальний посібник
- •Потреба використання об'єктно-орієнтованого програмування
- •Поняття про об’єктно-орієнтований підхід до розроблення складних програм
- •Основні компоненти об’єктно-орієнтованої мови програмування
- •Поняття про універсальну мову моделювання
- •Базові поняття класу
- •Код програми 2.1. Демонстрація механізму оголошення класу та його застосування
- •Поняття про конструктори і деструктори
- •Особливості реалізації механізму доступу до членів класу
- •Класи і структури - споріднені типи
- •Об'єднання та класи - споріднені типи
- •Поняття про вбудовані функції
- •Inline int myClass::Put() return c;
- •Особливості організації масивів об'єктів
- •Особливості використання покажчиків на об'єкти
- •Поняття про функції-"друзі" класу
- •Код програми 3.1. Демонстрація механізму використання "дружньої" функції для доступу до закритих членів класу
- •Код програми 3.2. Демонстрація механізму використання "дружньої" функції для перевірки статусу кожного об'єкта
- •Void Run(); //Таймер відліку часу
- •Void timerClass::Run()
- •Int mainO
- •Особливості механізму динамічної ініціалізації конструктора
- •Int s; public:
- •Void Run(); //Таймер відліку часу
- •Void timerClass::Run()
- •Int mainO
- •Особливості механізму присвоєння об'єктів
- •Int а, ь; public:
- •Int mainO
- •Особливості механізму передачі об'єктів функціям
- •Void Fun(myClassobj)
- •Int mainO
- •Конструктори, деструктори і передача об'єктів
- •Void Get(myClass obj)
- •Int mainO
- •Потенційні проблеми, які виникають при передачі об'єктів
- •Int *р; public:
- •Void Get(myClass &obj) // Передача об'єкта за посиланням
- •Int mainO
- •Особливості механізму повернення об'єктів функціями
- •Void Set(char*s) {strcpy(str, s);}
- •Void Show() {cout «"Рядок:" « str« endl;}
- •Int mainO
- •Int mainO
- •Механізми створення та використання конструктора копії
- •Використання конструктора копії для ініціалізації одного об'єкта іншим
- •Int mainO
- •Механізм використання конструктора копії для передачі об'єкта функції
- •Int mainO
- •Механізм використання конструктора копії при поверненні функцією об'єкта
- •Int mainO
- •3.7.4. Конструктори копії та їх альтернативи
- •Поняття про ключове слово this
- •Void Fun() {...};
- •Int mainO
- •Механізми перевизначення операторів з використанням функцій-членів класу
- •Int х, у, z; //Тривимірні координати
- •Int mainO
- •Intх,у,z; //Тривимірні координати
- •Void Show(char*s);
- •Int mainO
- •Int х, у, z; //Тривимірні координати
- •Int mainO
- •Особливості реалізації механізму перевизначення операторів
- •Механізми иеревизначення операторів з використанням функцій-не членів класу
- •Використання функцій-"друзів" класу для перевизначення бінарних операторів
- •Void Show(char*s);
- •Int mainO
- •Int mainO
- •Використання функцій-"друзів" класу для перевизначення унарних операторів
- •Int mainO
- •Особливості реалізації оператора присвоєння
- •Int mainO
- •Int mainO
- •Механізми перевизначення оператора індексації елементів масиву "[]"
- •Int mainO
- •Int aMas[size]; public:
- •Int mainO
- •Int aMas[size]; public:
- •Int mainO
- •Механізми перевизначення оператора виклику функцій "()"
- •Int mainO
- •Механізми перевизначення рядкових операторів
- •Конкатенація та присвоєння класу рядків з рядками класу
- •Void Show(char*s) {cout« s « string « endl;}
- •Конкатенація та присвоєння класу рядків з рядками, що закінчуються нульовим символом
- •Void Show(char*s) {cout« s « string « endl;}
- •Void Show(char*s) {cout« s « string « endl;}
- •Int mainO
- •Поняття про успадкування в класах
- •Int kolesa; // Кількість коліс int pasagyr; // Кількість пасажирів public:
- •Int mistkist; // Вантажомісткість у м куб. Public:
- •Int kolesa; // Кількість коліс int pasagyr; // Кількість пасажирів public:
- •Int mainO
- •Використання специфікатора доступу protected для надання членам класу статусу захищеності
- •Int mainO
- •Int mainO
- •Int mainO
- •Protected-членом класу derived, що робить його недоступним за його межами. */
- •Int d; // Захищений public:
- •Void showX() {cout« х « endl;}
- •Void showY() {cout« у « endl;}
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Успадкування віртуальних функцій
- •Void Show() {cout« Суг("Другий похідний клас.") « endl;}
- •Virtual void Show() {cout« Суг("Базовий клас.") « endl;}
- •Void Show() {cout« Суг("Перший похідний клас. ")« endl;}
- •Int mainO
- •Virtual void ShowO {cout« Суг("Базовий клас.") « endl;}
- •Void Show() {cout« Суг("Перший похідний клас. ")« endl;}
- •Int mainO
- •Void Show()
- •Void Show()
- •Int mainO
- •Void Show()
- •Void Show()
- •Int mainO
- •Void swapAb(aType &а, аТуре &b)
- •Int mainO
- •Приклад створення узагальненого класу для організації безпечного масиву
- •Int mainO
- •Використання в узагальнених класах аргументів, що не є узагальненими типами
- •Використання в шаблонних класах аргументів за замовчуванням
- •Int mainO
- •Механізм реалізації безпосередньо заданої спеціалізації класів
- •Int mainO
- •Основні особливості оброблення виняткових ситуацій
- •Системні засоби оброблення винятків
- •Xtest(1);
- •Xtest(2);
- •Перехоплення винятків класового типу
- •Використання декількох catch-наетанов
- •Варіанти оброблення винятків
- •Перехоплення всіх винятків
- •Накладання обмежень на тип винятків, які генеруються функціями
- •Int mainO
- •Xhandler(o); // Спробуйте також передати функції XhandlerO аргументи 1 і 2.
- •Void Xhandler(int test) throw 0
- •Повторне генерування винятку
- •Int mainO
- •Int mainO
- •Механізми перевизначення операторів new і delete
- •Void *р;
- •Void *p;
- •Int mainO
- •Класи потоків
- •Особливості механізмів перевизначення операторів введення-виведення даних
- •Створення перевюначених операторів виведення даних
- •Int mainO
- •Використання функцій-"друзів" класу для перевюначення операторів виведення даних
- •Int х, у, z; //Тривимірні координати (тепер це private-члени) public:
- •Int mainO
- •Створення перевюначених операторів введення даних
- •Istream &operator»(istream &stream, kooClass &obj)
- •Cout«"Введіть координати X, у і z:
- •Stream » obj.X » obj.Y » obj.Z;
- •Istream &operator»(istream &stream, objectType &obj)
- •// Код операторної функції введення даних
- •Class kooClass {// Оголошення класового типу int х, у, z; // Тривимірні координати
- •Istream &operator»(istream &stream, kooClass &obj)
- •Int mainO
- •Void unsetf(fmtflags flags),
- •Void showflags(ios::fmtflags f); // Відображення поточного стану опцій
- •Int mainO
- •Ios::fmtflags f; // Оголошення параметру для поточного стану опцій
- •Int mainO
- •Створення власних маніиуляторних функцій
- •Організація файлового введення-виведення даних
- •Відкриття та закриття файлу
- •Зчитування та запис текстових файлів
- •Ifstream in(argv[1], ios::in | ios::binary); if(!in){
- •In.CloseO; getchO; return 0;
- •Int mainO
- •Зчитування та записування у файл блоків даних
- •Int mainO
- •Ifstream inftest", ios::in | ios::binary); if(!in){
- •Використання функції eof() для виявлення кінця файлу
- •If(!in.Eof()) cout« ch;
- •In.CloseO; getchO; return 0;
- •Int main(int arge, char *argv[])
- •Ifstream f1(argv[1], ios::in | ios::binary); if(!f1) {
- •Ifstream f2(argv[2], ios::in | ios::binary);
- •Int main(int arge, char *argv[])
- •Ifstream in(argv[1], ios::in | ios::binary); if(!in){
- •In.Seekg(atoi(argv[2]), ios::beg); while(in.Get(ch)) cout« ch; getchO; return 0;
- •Int х, у, z; // Тривимірні координати; вони тепер закриті public:
- •Int mainO
- •Virtual void Fun() {}; // Робимо клас Base поліморфним
- •Int mainO
- •Virtual void FunO {cout«"у класі Base"« endl;}
- •Int mainO
- •Virtual void FunO {}
- •Void derivedOnlyO {cout«"Це об'єкт класу Derived"« endl;}
- •Int mainO
- •Void Fun(const int *р)
- •Int mainO
- •Namespace ns { int d;
- •Застосування настанови using
- •Int Comp(const void *а, const void *b);
- •Int mainO
- •Int Comp(const void *a, const void *b)
- •Int mainO
- •Int Fun10 const; // const-функція-член
- •Int PutO const; return c; // Все гаразд
- •Int mainO
- •0Bj.Set(1900); cout « Obj.PutO;
- •Void setJ(int х) const // Наступна функція не відкомпілюється.
- •Int а; public:
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Int myClass::*dp; // Покажчик на int-члена класу void (myClass::*fp)(int X); // Покажчик на функцію-члена
- •Int mainO
- •Механізми роботи з векторами
- •Int mainO
- •1 234 5 678 9 10 11 12 13141516 17 1819 Вміст подвоєно:
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Int mainO
- •Символи н
- •Символів представляють голосні звуки.
- •Int mainO
- •Int mainO
- •Int mainO
- •Void getaLine(string& inStr); // Отримання рядка тексту char getaCharO; //Отримання символу
- •Int aptNumber; // Номер кімнати мешканця
- •Void DisplayO; // Виведення переліку мешканців
- •Int aptNo; float rent[12]; public:
- •Void setRent(int, float); // Запис плати за місяць
- •Void insertRent(int, int, float); void DisplayO;
- •Int month, day; string category, payee; float amount; expense() {}
- •Int mainO
- •Void rentRecord::insertRent(int aptNo, int month, float amount)
- •SetPtrsRr.Insert(ptrRow); // Занести рядок вектор
- •If( setPtrsRr.Empty())
- •Else // Інакше
- •Int month, day; string category, payee; float amount;
- •«" 'Є' для запису витрат:";
- •Навчальний посібник
Організація файлового введення-виведення даних
У С++-системі введення-виведення також передбачено засоби для виконання відповідних операцій з використанням файлів. Файлові операції введення-виве- дення даних можна реалізувати після внесення у програму заголовка <fstream>, у якому визначено всі необхідні для цього класи і значення.
Відкриття та закриття файлу
У мові програмування C++ файл відкривається шляхом зв'язування його з потоком. Як уже зазначалося вище, існують потоки трьох типів: введення, виведення і введення-виведення. Щоб відкрити вхідний потік, необхідно оголосити потік класу ifstream. Для відкриття вихідного потоку потрібно оголосити потік класу ofstream. Потік, який передбачається використовувати для операцій як введення, так і виведення, повинен бути оголошений як потік класу fstream. Наприклад, у процесі виконання такого фрагмента коду програми буде створено вхідний і вихідний потоки, а також потік, що дає змогу виконувати операції в обох напрямах: ifstream in; // Вхідний потік ofstream out; // Вихідний потік fstream both; // Потік введення-виведення
Щоб відкрити файл, використовується функція ореп().
Створивши потік, його потрібно пов'язати з файлом. Це можна зробити за допомогою функції ореп(), причому у кожному з трьох потокових класів є своя фун- кція-член ореп(). їх прототипи мають такий вигляд:
void ifstream::open(const char*filename, ios::openmode mode = ios::in);
void ofstream::open(const char* filename, ios::openmode mode = ios::out | ios::trunc);
void fstream::open(const char*filename, ios::openmode mode = ios::in | ios::out);
У цих записах елемент filename означає ім'я файлу, яке може містити специфікатор шляху, що вказує доступ до нього. Елемент mode називається специфікатором режиму, який визначає спосіб відкриття файлу. Він повинен приймати одне або декілька значень перерахунку openmode, який визначено у класі ios:
ios::арр - приєднує до кінця файлу усі дані, що виводяться;
ios::ate - пошук потрібних даних починатиметься з кінця файлу;
ios::binary - відкриває файл у двійковому режимі;
ios::in - забезпечує відкриття файлу для введення даних;
ios::out - забезпечує відкриття файлу для виведення даних
ios::trunc - призводить до руйнування вмісту файлу.
Декілька значень перерахунку openmode можна об'єднувати за допомогою логічного додавання (АБО).
Вартоа' нати'.аПараметр mode для функції fstream::open() за замовчуванням може не дорівнювати значенню ІП \ out (це залежить від використовуваного компілятора). Тому у разі потреби цей параметр Вам доведеться задавати безпосередньо.
Нео! хідноапам ятати! За замовчуванням усі файли відкриваються в текстовому режимі.
Внесення значення ios::app у параметр mode забезпечить приєднання до кінця файлу всіх даних, які виводяться. Це значення можна застосовувати тільки до файлів, відкритих для виведення даних.
Під час відкриття файлу з використанням значення ios::ate пошук потрібних даних починатиметься з кінця файлу. Незважаючи на це, операції введення-виве- дення даних можуть, як і раніше, виконуватися по всьому файлу.
Значення ios::binary дає змогу відкрити файл у двійковому режимі. Як уже зазначалося вище, в текстовому режимі можуть відбуватися деякі перетворення символів (наприклад, послідовність, що складається з символів повернення каретки і переходу на новий рядок, може бути перетворена у символ нового рядка). Під час відкриття файлу у двійковому режимі ніякого перетворення символів не здійснюється.
Значення ios::in вказує на те, що цей файл відкривається для введення даних, а значення ios::out забезпечує відкриття файлу для виведення даних.
Використання значення ios::trunc призводить до руйнування вмісту файлу, ім'я якого збігається з параметром filename, а сам цей файл урізається до нульової довжини. При створенні вихідного потоку типу ofstream будь-який наявний файл з іменем filename автоматично урізається до нульової довжини.
Вартоа натиі Будь-який файл, що містить форматний текст або ще не- оброблені дані, можна відкрити як у двійковому, так і в текстовому режимі. Єдина відмінність між цими режимами полягає у перетворенні (чи ні) символів.
У процесі виконання такий фрагмент коду програми відкриває звичайний вихідний файл:
ofstream myStream; out.openfTecT");
Оскільки параметру mode функції орепО за замовчуванням встановлює значення, яке дорівнює відповідному типу потоку, який відкривається, то у наведеному вище прикладі взагалі немає потреби задавати його значення.
У результаті невдалого виконання функції орепО не відкритому потоку при використанні булевого виразу встановлюється значення, яке дорівнює ФАЛЬШ. Такий механізм може слугувати для підтвердження успішного відкриття файлу, наприклад, за допомогою такої if-настанови: if(!myStream) {
cout«"Не вдається відкрити файл" « endl;
// оброблення помилки
_}
Нео! хідноапам ятати'.аПеред спробою отримання доступу до даних файла, необхідно завжди перевіряти результат виклику функції ореп().
Рекомендується також перевірити факт успішного відкриття файлу за допомогою функції is_open(), яка є членом класів fstream, ifstream і ofstream. Її прототип має такий вигляд: bool is_open();
Ця функція повертає значення ІСТИНА, якщо потік пов'язаний з відкритим файлом, і ФАЛЬШ - в іншому випадку. Наприклад, використовуючи такий фрагмент коду програми, можна дізнатися про те, чи відкрито у цей момент потоковий об'єкт myStream:
if (! my Stream. is_o pe n 0) {
cout«"Файл не відкрито" « endl;
//...
}
Хоча цілком коректно використовувати функцію орепО для відкриття файлу, проте здебільшого це робиться по-іншому, оскільки класи ifstream, ofstream і fstream містять конструктори, які автоматично відкривають заданий файл. Параметри у цих конструкторів і їх значення (що діють за замовчуванням) збігаються з параметрами і відповідними значеннями функції орепО- Тому найчастіше файл відкривається так, як це показано в наведеному нижче прикладі: ifstream myStreamfmyFile"); // Файл відкривається для введення
Якщо з якоїсь причини файл відкрити неможливо, то потоковій змінній, що пов'язується з цим файлом, встановлюється значення, яке дорівнює ФАЛЬШ.
Щоб закрити файл, використовується функція-член close(). Наприклад, щоб закрити файл, який пов'язано з потоковим об'єктом myStream, потрібно використати таку настанову: myStream.closeO;
Функція closeO не має параметрів і не повертає ніякого значення.
