
- •Міністерство надзвичайних ситуацій України Львівський державний університет безпеки життєдіяльності Юрій грицюк, Тарас рак
- •Навчальний посібник
- •Потреба використання об'єктно-орієнтованого програмування
- •Поняття про об’єктно-орієнтований підхід до розроблення складних програм
- •Основні компоненти об’єктно-орієнтованої мови програмування
- •Поняття про універсальну мову моделювання
- •Базові поняття класу
- •Код програми 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 mainO
{
cFunO;
getchO; return 0;
}
Ця функція буде скомпонована як С-функція. void cFunO {
cout«"Ця функція скомпонована як С-функція"« endl;
Нео! хгдноапам' ятати! Ключове слово ЄХІЄГП - необхідна складова специфікації компонування. Понад це, специфікація компонування повинна бути глобальною; її не можна використовувати в тілі якої-небудь функції.
Використовуючи наступний формат специфікації компонування, можна задати не одну, а відразу декілька функцій, extern "Moeä' {
прототипи_фунщй
}
Специфікації компонування використовуються досить рідко, і Вам, можливо, ніколи не доведеться їх застосовувати. Основне їх призначення - дати змогу застосування у С++-програмах кодів програм, написаних іншими організаціями мовами, відмінними від мови C++.
Оператори вказання на члени класу і
У мові програмування C++ передбачено можливість згенерувати покажчик спеціального типу, який "посилається" не на конкретний примірник члена в об'єкті, а на члена класу взагалі. Покажчик такого типу називається покажчиком на члена класу (pointer-to-member). Це - не звичайний С++-покажчик. Цей спеціальний покажчик забезпечує тільки відповідний зсув у об'єкті, який дає змогу виявити потрібного члена класу. Оскільки покажчики на члени - не справжні покажчики, то до них не можна застосовувати оператори "." і Для отримання доступу до члена класу через покажчик на член необхідно використовувати спеціальні оператори і
Оператори вказання на члени класу дають змогу отримати доступ до члена класу через покажчик на цього члена.
Якщо ідея, яку викладено у попередньому абзаці, Вам видалася трохи "невиразною", то наведений нижче приклад допоможе її з'ясувати. У процесі виконання цієї програми відображається сума чисел від 1 до 7. Тут доступ до членів класу туСІаз5(функції Sum() і змінної sum) реалізується шляхом використання покажчиків на члени.
Код програми 11.17. Демонстрація механізму використання покажчиків на члени класу (початкова версія)
#include <iostream> // Для потокового введення-виведення
using namespace std; // Використання стандартного простору імен
class myClass {// Оголошення класового типу public:
int sum;
void myClass::Sum(int x);
};
void myClass::Sum(int x)
{
sum = 0;
for(int i=x; i; i~) sum += i;
}
Int mainO
{
Int myClass::*dp; // Покажчик на int-члена класу void (myClass::*fp)(int X); // Покажчик на функцію-члена
myClass ObjC;
dp = myClass::sum; // Отримуємо адресу члена даних fp = &myClass::Sum; // Отримуємо адресу функції-члена класу
(ObjC*fj3)(7); // Обчислюємо суму чисел від 1 до 7 cout«"Сума чисел від 1 до 7 дорівнює"« ObjC.*dp;
getchO; return 0;
}
Результат виконання цієї програми є таким:
Сума чисел від 1 до 7 дорівнює 28
У функції main() створюється два члени-покажчики: dp (для вказівки на змінну sum) і fp (для вказівки на функцію SumO). Зверніть увагу на синтаксис кожного оголошення. Для уточнення класу використовують оператор дозволу контексту (оператор дозволу області видимості). Програма також створює об'єкт типу myClass з іменем ObjC.
Потім програма отримує адреси змінної sum і функції Sum() і присвоює їх покажчикам відповідно dp і fjD. Як уже зазначалося вище, ці адреси насправді є тільки зсувами в об'єкті типу myClass, згідно з якими можна знайти змінну sum і функцію Sum(). Потім програма використовує покажчик на функцію fp, щоб викликати функцію Sum() для об'єкта ObjC. Наявність додаткових круглих дужок пояснюється необхідністю коректного застосування оператора Нарешті, програма відображає значення суми чисел, отримуючи доступ до змінної sum об'єкта ObjC через покажчик dp.
Під час доступу до члена об'єкта за допомогою об'єкта або посилання на нього необхідно використовувати оператор Але, якщо для цього використовується покажчик на об'єкт, то потрібно використовувати оператор як показано у цій версії попереднього коду програми.
Код програми 11.18. Демонстрація механізму використання покажчиків на члени класу (модифікована версія)
#include <iostream> // Для потокового введення-виведення
using namespace std; // Використання стандартного простору імен
class myClass {// Оголошення класового типу public:
int sum;
void myClass::Sum(int x);
};
void myClass::Sum(int x)
{
sum = 0;
for(int і=х; і; і--) sum += і;
int mainO
int myCiass::*dp; // Покажчик на int-члена класу void (myClass::*fp)(int х); // Покажчик на функцію-члена myClass *с, ObjD; // Член с зараз -- покажчик на об'єкт
с
=
&ObjD;
dp
=
&myClass::sum;
fp
= &myClass::Sum;
(c->*fp)(7); //Тепер використовуємо оператор для виклику функції SumQ.
cout«"Сума чисел від 1 до 7 дорівнює" « c->*dp; // ->* getchQ; return 0;
У цій версії змінна с оголошується як покажчик на об'єкт типу myClass, а для доступу до члена даних sum і функції-члена Sum() використовують оператор
Нео! хідноапам ятати! Оператори вказання на члени класу призначені для спеціальних випадків, тому їх не варто використовувати для розв'язання звичайних повсякденних задач програмування.
Створення функцій перетворення типів
Іноді виникає потреба в одному виразі об'єднати створений програмістом клас з даними інших типів. Хоча перевизначені операторні функції можуть забезпечити використання змішаних типів даних, у деяких випадках все ж таки можна обійтися простим перетворенням типів. І тоді, щоб перетворити клас у тип, сумісний з типом решти частини виразу, потрібно використовувати функцію перетворення типу. Загальний формат функції перетворення типу має такий вигляд:
operator typeO {return value',}
У цьому записі елемент type - новий тип, який є метою нашого перетворення, а елемент value - значення після перетворення. Функція перетворення повинна бути членом класу, для якого вона визначається.
Функція перетворення автоматично перетворить тип класу в інший
тип.
Щоб проілюструвати створення функцій перетворення, скористаємося класом kooClass ще раз. Припустимо, що нам потрібно мати засіб перетворення об'єкта типу kooClass у цілочисельне значення, яке можна використовувати в цілочи- сельному виразі. Понад це, таке перетворення повинно відбуватися з використанням добутку значень трьох координат. Для реалізації цього будемо використовувати функцію перетворення, яка має такий вигляд: operator intQ {return х * у * z;}
Тепер розглянемо код програми, яка ілюструє роботу функції перетворення.
Код програми 11.19. Демонстрація механізму використання функції перетворення типів #include <iostream> // Для потокового введення-виведення
using namespace std; // Використання стандартного простору імен
class kooClass {// Оголошення класового типу int х, у, z; // Тривимірні координати public:
kooClass(int a, int b, int c) {x = а; у = b; z = c;} kooClass operator+(kooClass obj);
friend ostream &operator«(ostream &stream, kooClass &obj); operator int() {return x * у * z;}
};
// Відображення тривимірних координат x, у, z - функція виведення даних // для класу kooClass.
ostream &operator«(ostream &stream, kooClass &obj)
{
stream « obj.x «", stream « obj.y «", stream « obj.z « endl;
return stream; // Повертає посилання на параметр stream
}
kooClass kooClass: :operator+(kooClass obj)
{
kooClass tmp(0,0,0);
tmp.x = x + obj.x; tmp.y = у + obj.y; tmp.z = z + obj.z;
return tmp; // Повертає модифікований тимчасовий об'єкт
}