
- •Міністерство надзвичайних ситуацій України Львівський державний університет безпеки життєдіяльності Юрій грицюк, Тарас рак
- •Навчальний посібник
- •Потреба використання об'єктно-орієнтованого програмування
- •Поняття про об’єктно-орієнтований підхід до розроблення складних програм
- •Основні компоненти об’єктно-орієнтованої мови програмування
- •Поняття про універсальну мову моделювання
- •Базові поняття класу
- •Код програми 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 d; // Захищений public:
- •Int mainO
- •Protected-членом класу derived, що робить його недоступним за його межами. */
- •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;
- •«" 'Є' для запису витрат:";
- •Навчальний посібник
Механізми роботи з векторами
Одним з найпоширеніших контейнерів загального призначення є вектор. Аналогічний клас vector підтримує динамічний масив, який у разі потреби може збільшувати (зменшувати) свій розмір. Як уже зазначалося вище, у мові програмування C++ розмір масиву фіксується при компілюванні. І хоча це найефективніший спосіб реалізації масивів, він водночас є і обмежувачем, оскільки розмір масиву не можна змінювати у процесі виконання програми. Ця проблема розв'язується за допомогою вектора, який у міру потреби забезпечує виділення додаткового об'єму пам'яті. Незважаючи на те, що вектор - це динамічний масив, проте, для доступу до його елементів можна використовувати стандартне позначення індексації елементів масивів.
Вектори є динамічними масивами.
Ось як виглядає шаблонна специфікація для класу vector:
template <class myType, class Allocator = allocator<myType» class vector
У цьому записі myType - тип даних, який зберігається, а елемент Allocator означає розподільник пам'яті, який за замовчуванням використовує стандартний розподільник. Клас vector має такі конструктори: explicit vector(const Allocator &а = AllocatorO);
explicit vector(size_type num, const myType &val = myTypeO, const Allocator &a = AllocatorO); vector(const vector<myType, Allocator &ob);
template <class lnlter> vector(lnlter start, Inlter end, const Allocator &a = AllocatorO);
Перша форма конструктора призначена для створення порожнього вектора. Друга створює вектор, який містить пит "елементів із значенням val", причому значення val може бути встановлено за замовчуванням. Третя форма дає змогу створити вектор, який містить ті самі елементи, що і заданий вектор ob. Четверта призначена для створення вектора, який містить елементи у діапазоні, заданому пара- метрами-ітераторами start і end.
Заради досягнення максимальної гнучкості та переносності будь-який об'єкт, який призначено для зберігання у векторі, повинен визначатися конструктором за замовчуванням. Окрім цього, він повинен визначати операції "<" і "==". Деякі компілятори можуть зажадати визначення і інших операторів порівняння. (З причини існування різних реалізацій для отримання точної інформації про вимоги, що пред'являються Вашим компілятором, необхідно звернутися до документації, що додається до нього.) Всі вбудовані типи даних автоматично задовольняють ці вимоги.
Незважаючи на те, що наведений вище синтаксис шаблону виглядає достатньо "масивним", у оголошенні вектора немає нічого складного. Розглянемо декілька прикладів:
vector<int> iv; // Створення вектора нульової довжини для зберігання int-значень.
vector<char> cv(5); // Створення 5-елементного вектора для зберігання char-значень. vector<char> cv(5, Y); // Ініціалізація 5-елементного char-вектора. vector<int> iv2(iv); // Створення int-вектора на основі int-вектора iv.
Для класу vector визначено такі оператори порівняння: ==, <, <=, !=, > і >=. Для вектора також визначено оператор індексації елементів масиву "[]", який дає змогу отримати доступ до своїх елементів за допомогою стандартного запису
з використанням індексів. Функції-члени, визначені у класі vector, перераховані в табл. 12.2. Найважливішими з них є sizeO, begin(), endO, push_back(), insertO і erase(). Дуже корисна функція sizeO, яка повертає поточний розмір вектора, оскільки вона дає змогу визначити розмір вектора у процесі виконання програми.
Нео! хідноапам ятати! Вектори у разі потреби збільшують свій розмір, тому потрібно мати можливість визначати його величину під час роботи коду програми, а не тільки при компілюванні.
Функція begin() повертає ітератор, який вказує на початок вектора. Функція endO повертає ітератор, який вказує на кінець вектора. Як уже пояснювалося вище, ітератори подібні до покажчиків, і за допомогою функцій begin() і end() можна отримати ітератори початку і кінця вектора відповідно.
Табл. 12.2. Функції-члени, визначені у класі vector
OyHKiiia-HJieH |
Опис |
1 |
2 |
template <class lnlter> void assign(lnlter start, Inlter end)] |
Поміщає у вектор послідовність, що визначається параметрами start і end |
void assign(size_type num, const myType &val)] |
Поміщає у вектор пит елементів із значенням val |
reference at(size_type /); const reference atfsize type i) const; |
Повертає посилання на елементи, які задаються параметром і |
reference back(); const reference back() const; |
Повертає посилання на останній елемент у векторі |
iterator beginO; const iterator beginf) const; |
Повертає ітератор для першого елемента у векторі |
size_type capacityO const; |
Повертає поточну місткість вектора, або кількість елементів, яка може зберігатися у векторі до того, як виникне потреба у виділенні додаткової пам'яті |
void clearO; |
Видаляє всі елементи з вектора |
bool emptyO const; |
Повертає істинне значення, якщо використовуваний вектор є порожнім, і помилкове значення - інакше |
const iterator end() const; iterator endO; |
Повертає ітератор для кінця вектора |
iterator erase(iterator /); |
Видаляє елемент, який адресується ітератором і\ повертає ітератор для елемента, розташованого після видаленого |
iterator erase(iterator start, iterator end)] |
Видаляє елементи у діапазоні, що задається параметрами start і end', повертає ітератор для елемента, розташованого за останнім видаленим елементом |
reference front(); const reference frontf) const; |
Повертає посилання на перший елемент у векторі |
allocator type get allocator() const; |
Повертає розподільник пам'яті вектора |
iterator insert(iterator /', const myType &val= myType ()); |
Вставляє значення val безпосередньо перед елементом, заданим параметром /’; повертає ітератор для цього елемента |
void insert(iterator /, sizejype num, const myType &val)] |
Вставляє пит копій значення val безпосередньо перед елементом, заданим параметром і |
template <class lnlter> void insert(itera- tor /', Inlter start, Inlter end)] |
Вставляє у вектор послідовність елементів, що визначаються параметрами start і end, безпосередньо перед елементом, заданим параметром і |
sizejype max_size() const; |
Повертає максимальну кількість елементів, яку може містити вектор |
reference operator[](size_type /) const; const_reference operator[](size_type /) const; |
Повертає посилання на елементи, які задаються параметром і |
void pop backQ; |
Видаляє останній елемент у векторі |
void push_back(const myType &val); |
Додає у кінець вектора елемент, значення якого задане параметром val |
reverse_iterator rbegin(); const reverse iterator rbeginO const; |
Повертає реверсивний ітератор для кінця вектора |
reversejterator rendQ; |
Повертає реверсивний ітератор для початку век- |
1 |
2 |
const reverse iterator rendO const; |
тора |
void reserve(size_type num); |
Встановлює місткість вектора, що дорівнює значенню, не меншому від заданого пит |
void resize(size_type num, myType val = myTypeO); |
Встановлює розмір вектора, що дорівнює значенню, заданому параметром пит. Якщо вектор для цього потрібно подовжити, то в його кінець додаються елементи із значенням, що задається параметром val |
size type size() const; |
Повертає поточну кількість елементів у векторі |
void swap(deque<myType, Allocator &ob): |
Здійснює обмін елементами викличного вектора і вектора ob |
Функція push_back() поміщає задане значення у кінець вектора. У разі потреби довжина вектора збільшується так, щоб він міг прийняти новий елемент. За допомогою функції insert() можна додавати елементи у середину вектора. Окрім цього, елементи вектора можна ініціалізувати. У будь-якому випадку, якщо вектор містить елементи, то для доступу до них і їх модифікації можна використовувати засіб індексації елементів масивів. А за допомогою функції erase() можна видаляти елементи з вектора.
Розглянемо короткий приклад, який ілюструє базову поведінку вектора.
Код програми 12.1. Демонстрація механізму базової поведінки вектора #include <vcl>
#include <iostream> // Для потокового введення-виведення
#include <conio> // Для консольного режиму роботи
#include <vector> // Для роботи з контейнерним класом "Вектор"
using namespace std; // Використання стандартного простору імен