
- •Міністерство надзвичайних ситуацій України Львівський державний університет безпеки життєдіяльності Юрій грицюк, Тарас рак
- •Навчальний посібник
- •Потреба використання об'єктно-орієнтованого програмування
- •Поняття про об’єктно-орієнтований підхід до розроблення складних програм
- •Основні компоненти об’єктно-орієнтованої мови програмування
- •Поняття про універсальну мову моделювання
- •Базові поняття класу
- •Код програми 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;
- •«" 'Є' для запису витрат:";
- •Навчальний посібник
Int kolesa; // Кількість коліс int pasagyr; // Кількість пасажирів public:
void setKolesa(int f) {kolesa = f;} int getKolesa() {return kolesa;}
void setPasagyr(int t) {pasagyr = t;} int getPasagyr() {return pasagyr;}
};
// Оголошення похідного класу вантажівок, class vanAuto: public dorZasib {
int mistkist; // вантажомісткість у м куб. public:
void setMistkist(int h) {mistkist = h;} int getMistkistO {return mistkist;}
void Show(char*s);
};
enum type {car, van, wagon}; // Перерахункові тип даних
// Оголошення похідного класу автомобілів, class lehAuto: public dorZasib { enum type carType; public:
void setType(type t) {carType = t;} enum type getType() {return carType;} void Show(char*s);
};
void vanAuto::Show(char*s)
{
cout«"Транспортний засіб:" « s « endl; cout«"коліс:" « getKolesaO «" шт"« endl; cout«"пасажирів:" « getPasagyr() «" осіб" « endl; cout«"вантажомісткість:"« mistkist«" м куб" « endl; cout« endl;
}
void lehAuto::Show(char*s)
{
cout«"Транспортний засіб:" « s « endl; cout«"коліс:" « getKolesa() <<" шт"<< er|dl; cout«"пасажирів:" « getPasagyrO «" осіб" « endl; cout«"тип:"; switch(getTypeO) {
case van: cout«"автофургон" « endl; break;
case car: cout«"легковий" « endl; break;
case wagon: cout«"фура" « endl;
}
cout« endl;
}
int mainO
{
vanAuto ObjT, ObjF; lehAuto ObjG;
// Ініціалізація об'єкта типу вантажівка ObjT.setKolesa(18);
ObjT.setPasagyr(2);
ObjT.setMistkist(160);
// Ініціалізація об'єкта типу вантажівка Obj F. setKo lesa (6);
ObjF.setPasagyr(3);
ObjF.setMistkist(8Q);
// Виведення інформації про об'єкт типу вантажівка ObjT.ShowfBam^iBKa 1");
ObjF.Show("Bam^iBKa 2");
// Ініціалізація об'єкта типу автомобіль ObjG.setKolesa(4);
ObjG.setPasagyr(6);
ObjG.setType(van);
// Виведення інформації про об'єкт типу автомобіль ObjG.Showf Автомобіль"); getchO; return 0;
}
Внаслідок виконання ця програма відображає на екрані такі результати:
Транспортний засіб: Вантажівка 1
коліс: 18 шт.
пасажирів: 2 осіб
вантажомісткість: 160 м куб.
Транспортний засіб: Вантажівка 2 коліс: 6 шт. пасажирів: 3 осіб вантажомісткість: 80 м куб.
Транспортний засіб: Автомобіль коліс: 4 шт. пасажирів: 6 осіб тип: автофургон
Як видно з результатів виконання цієї програми, основна перевага успадкування полягає у тому, що вона дає змогу створити базовий клас, який потім можна використовувати у складі похідних, більш спеціалізованих класів. Таким чином, кожен похідний клас може слугувати певній меті та, водночас, залишатися частиною загальної класифікації.
Вартоа нати! Зверніть увагу на те, що обидва класи VSnAllto і lehAuto містять функцію-члена ShowQ, яка відображає інформацію про об'єкт. Ця функція демонструє ще один аспект об’єктно-орієнтованого програмування - поліморфізм. Оскільки кожна функція ShowQ пов'язана з власним класом, компілятор може легко "зрозуміти", яку саме функцію потрібно викликати для цього об'єкта.
Після поверхневого ознайомлення із загальним механізмом успадкування одним класом іншого можна перейти і до вивчення конкретних його деталей.
Управління механізмом доступу до членів базового класу
Якщо один клас успадковує інший, то члени базового класу стають членами похідного. Статус доступу до членів базового класу у похідному класі визначається специфікатором доступу, який використовують для успадкування базово-
го класу. Специфікатор доступу до членів базового класу виражається одним з ключових слів: public, private або protected. Якщо специфікатор доступу не вказано, то за замовчуванням використовується специфікатор private, коли йдеться про успадкування типу class. Якщо ж успадковується тип struct, то за відсутності безпосередньо заданого специфікатора доступу використовується специфікатор public.
Якщо базовий клас успадковується як public-клас, та всі його риЬІІС-чле- ни стають public-членами похідного класу.
Розглянемо поки що раміфікацію (розгалуження) використання специфікаторів доступу до членів класу public або private1 (рис. 5.1).
Успадкування,
.базового класу
Спец»
|
|
public |
|
||
public |
private |
protected |
|||
|
< |
і |
Г |
X |
|
|
Похідний клас |
|
|||
public |
private |
protected |
|||
Доступні члени |
Не доступні члени |
Доступні члени |
private
public
private
protected
1
t
>
f
X
f
мкатори
доступу,
до
членів базового класу
Похідний клас |
||
private |
private |
private |
Доступні члени |
He доступні члени |
Доступні члени |
protected |
|||||
public |
private |
protected |
|||
|
f > |
f x |
r |
Похідний клас |
||
protected |
protected |
protected |
He доступні члени |
He доступні члени |
Доступні члени |
Рис. 5.1. Управління механізмом доступу до членів базового класу
В усіх випадках private-члени базового класу залишаються закритими у межах цього класу і не доступні для членів похідного. Наприклад, у наведеному нижче коді програми public-члени класу baseClass стають public-членами класу derived. Отже, вони будуть доступними і для інших частин програми.
Код програми 5.2. Демонстрація механізму доступу до членів базового класу після їх успадковується як риЬІІс-клас
#include <vcl>
#include <iostream> // Для потокового введення-виведення
#include <conio> // Для консольного режиму роботи
using namespace std; // Використання стандартного простору імен
class baseClass { // Оголошення базового класу int с, d; public:
void setB(int a, int b) {c = a; d = b;} void showB(char *s)
{cout« s «"c=" « c «d=" « d « endl;}
};
// Оголошення похідного класу class derived: public baseClass { intf; public:
derived(int x) {f = x;} void showF(char*b, char*p)
{showB(b); cout« p «"f= "«f« endl;}
};
int mainO
{
derived ObjD(3);
// Доступ до членів класу baseClass ObjD.setB(1,2);
// Доступ до членів класу baseClass ObjD.showB("Ba30BHÜ клас:"); cout« endl;
// Доступ до члена класу derived ObjD.showF("Ba30BHÜ клас:", "Похідний клас:");
getchO; return 0;
}
Внаслідок виконання ця програма відображає на екрані такі результати: Базовий клас: с= 1; d= 2
Базовий клас: с= 1; d= 2 Похідний клас: f= З
Оскільки функції setBO і showBO (члени класу baseClass) успадковані класом derived як public-члени, то їх можна викликати для об'єкта типу derived у функції main(). Позаяк члени даних с та d визначені як private-члени, то вони залишаються закритими у межах свого класу baseClass.
Протилежністю відкритому (public) успадкуванню є закрите (private).
class baseClass { // Оголошення базового класу int с, d; public:
void setB(int a, int b) {c = a; d = b;}
void showB(char *s) {cout« s «"c=" « c «d=" « d « endl;}
};
// Відкриті члени класу baseClass тепер стають закритими членами класу derived, class derived: private baseClass { int f; public:
derived(int x) {f = x;}
void showF(char*b, char*p) {showB(b); cout« p «"f=" «f« endl;}
};