
- •Міністерство надзвичайних ситуацій України Львівський державний університет безпеки життєдіяльності Юрій грицюк, Тарас рак
- •Навчальний посібник
- •Потреба використання об'єктно-орієнтованого програмування
- •Поняття про об’єктно-орієнтований підхід до розроблення складних програм
- •Основні компоненти об’єктно-орієнтованої мови програмування
- •Поняття про універсальну мову моделювання
- •Базові поняття класу
- •Код програми 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;
- •«" 'Є' для запису витрат:";
- •Навчальний посібник
Навчальний посібник
Літературний редактор В. В. Дудок
Редактор Г.М. Падик Технічний редактор О.В. Хлевной Авторські комп'ютерний набір та верстка
Підписано до друку 25.05.2011. Формат 60x84/16. Папір офсетний. Гарнітура Times. Друк на різографі. Ум. др. арк. 23,48. Ум. фарбо-відб. 23,72. Наклад 350 прим. Зам. № 29/2011
Видавництво ЛДУ БЖД, Україна, 79007, м. Львів, вул. Клепарівська, 35 Тел./факс: (032) 233-14-77; E-mail: mail@ubgd.lviv.ua; Wed-адреса: http://www.ubgd.lviv.ua Свідоцтво про внесення суб'єкта видавничої справи до державного реєстру видавців, виготовників і розповсюджувачів видавничої продукції, серія ДК, № 368 від 20.03.2001 р.
Грицюк Ю.І., Рак Т.Є.
Об'єктно-орієнтоване програмування мовою С++ : навчальний посібник. - Львів : Вид-во Львівського ДУ БЖД, 2011. -404 с. - Статистика: іл. 18, табл. 12, бібліогр. 34.
КВК 978-966-3466-86-3
Розглядаються основні особливості розроблення об'єктно-орієнтова- них програм мовою С++. На конкретних прикладах вивчаються класи та робота з ними, перевизначення операторів і успадкування в класах, віртуальні функції та поліморфізм, шаблони в класах і оброблення виняткових ситуацій, С++-система введення-виведення, динамічна ідентифікація типів і оператори приведення типу, простір імен і інші ефективні програмні засоби, введення в стандартну бібліотеку шаблонів і особливості роботи преп- роцесора С++. На завершення подано матеріал, який стосується формалізації процесу розроблення об'єктно-орієнтованого програмного забезпечення.
Викладений матеріал базується на стандарті Д^МБО мови програмування С++, а також зазначено нововведення, які затверджені в стандарті ІБОЛЕС 14882:2003. Наведено важливу для практичного використання та програмування інформацію про додаткові можливості компілятора, середовища та бібліотек Вогіапсі С/С++.
Видання призначено для курсантів і студентів, які вивчають програмування в рамках різних навчальних дисциплін, а також для всіх, хто бажає самостійно опанувати технологію програмування мовою С++.
Вартоа нати! Формально між двома наведеними вище форматами ініціалізації параметризованих конструкторів існує невелика відмінність, яку Ви зрозумієте при подальшому вивченні цього навчального посібника. Але ця відмінність не впливає на результати виконання програм, представлених у цьому розділі.
У наведеному нижче коді програми, призначеної для обчислення значення арифметичного виразу, продемонстровано механізм використання параметризованого конструктора.
Код програми 2.3. Демонстрація механізму використання параметризованого
конструктора
// Для потокового введення-виведення II Для використання математичних функцій
II Для консольного режиму роботи II Використання стандартного простору імен
// Оголошення класового типу
// Містить ідентифікаційний номер об'єкта
1 За замовчуванням після десяткової крапки відображається шість цифр.
Вартоа нати! У загальному випадку довільний доступ для операцій введен- ня-виведення даних повинен виконуватися тільки для файлів, відкритих у двійковому режимі. Перетворення символів, які можуть відбуватися в текстових файлах, можуть призвести до того, що запитувана позиція файлу не відповідатиме його реальному вмісту.
Функція seekg() переміщає покажчик, що "відповідає" за введення даних, а функція seekpQ ~ покажчик, що "відповідає" за виведення.
Поточну позицію кожного файлового покажчика можна визначити за допомогою таких двох функцій:
1 Парадигма програму&ання - основні принципи програмування (не плутати з розробленням програм), або, па- радигмне програмування. Парадигма програмування надає (та визначає) те, як програміст розглядає роботу програми. Наприклад, в об'єктно-орієнгованому програмуванні, програміст розглядає програму як множину взаємодіючих між собою об'єктів, водночас як у функційному програмуванні програму можна представити як обчислення послідовності функцій без станів.
Основні парадигми програмування: процедурне програмування (англ. Procedural programming); модульне програмування (англ. Modular programming); об'єктно-орієнтоване програмування (англ. Object-oriented programming); функційне програмування (англ. Functional programming); імперативне програмування (англ. Imperative programming); декларативне програмування (англ. Declarative programming); прототипне програмування (англ. Prototype-based programming); аспектно-орієнтоване програмування (англ. Aspect-oriented programming); предметно-орієнтоване програмування (англ. Subject-oriented programming); функціонально- орієнтоване програмування (англ. Feature-oriented programming).
Кафедра управління інформаційною безпекою
Львівський ДУ БЖД, вул. Клепарівська 35, м. Львів, 79007
Тел. моб.: 067-944-11-15. E-mail: gryciuk.yura@gmaii.com
1 http://uk.wikipedia.oig/wiki/C%2B%2B
1 ANSI є скороченням від англійської назви Американського Національного Інституту Стандартів, a ISO - від Міжнародної Організації Стандартів.
1 Граді Буч (Сггасіу ВоосЬ; *27 лютого 1955 р., Техас) - американський вчений в галузі інформаційних технологій і програмування. Автор класичних праць з об'єктно-орієнтованого аналізу. Один з творців мови ІІМЬ.
2 Івар Яльмар Джекобсон (*2 вересня 1939 р.) - Шведський вчений в галузі комп'ютерних технологій, відомий як основний розробник таких мов як ІІМЬ, ОЬуесІогу, ІШР і об'єкгно-орієнтованого підходу до розроблення програмного забезпечення.
1Розділ 2. Класи — основа об'єктно-орієнтованого програмування
1 Іншими словами, об'єкт займає певну область пам'яті, а визначення типу - ні.
1 При цьому не можна вказувати навіть тип void.
2 Задля справедливості зазначимо, що класу myClass деструктор не потрібний, а його наявність тут можна виправдати тільки з ілюстративною метою.
1 Таким чином, об'єднання також визначає тип класу.
1 Застосування операторів "крапка" і "стрілка" для об'єктів відповідає їх застосуванню для структур і об'єднань.
1 Точніше, під час її виклику не можна задавати ім'я об'єкта.
1 Іншими словами, створюється точний дублікат об'єкта.
1 Як створити конструктор копії, буде показано далі в цьому розділі.
1 Ви можете не побачити на екрані виведене "сміття". Це залежить від того, як Ваш компілятор реалізує динамічне виділення області пам'яті. Проте помилка все одно тут наявна.
2 Це робиться автоматично і без нашої на те згоди.
1 Тернарний оператор "?" перезавантажувати не можна.
1 Передусім, це становить саму суть присвоєння.
2 Такий стан речей цілком узгоджується з традиційною дією оператора
1 Цей параметр також використовується як ознака постфіксної форми і для оператора декремента.
1 Для домашньої вправи спробуйте визначити операторну функцію декремента для класу кооСІазг
1 Іншими словами, А - В не те ж саме, що В - А!
1 Підказка: одне з них викликане настановою delete в тілі операторної функції qperator= ().
Нео! хідноапам'ятати! Щоб оператор індексації елементів масиву "[]" можна було використовувати як зліва, так і праворуч від оператора присвоєння, достатньо вказати значення, що повертається операторною функцією орвГЗ- torjJQ, як посилання.
Можна розробити операторну функцію operator[]0 так, щоб оператор індексації елементів масиву "[]" можна було використовувати як зліва, так і праворуч від оператора присвоєння. Для цього достатньо вказати, що значення, що повертається операторною функцією operator[]0, є посиланням. Цю можливість продемонстровано у наведеному нижче коді програми.
1 Звичайно ж, його, як і раніше, можна використовувати і праворуч від оператора присвоєння.
1 Специфікатор protected описано у наступному підрозділі.
Якщо базовий клас успадковується як private-клас, то всі його public- члени стають private-членами похідного класу.
Наприклад, наведений нижче код програми не відкомпілюється, оскільки обидві функції setB() і showB() тепер стали private-членами класу derived (тобто, доступними тільки для функцій-членів похідного класу), і тому їх не можна викликати з функції main().
Код програми 5.3. Демонстрація механізму доступу до членів базового класу після їх успадковується як private-клас
#include <vcl>
#include <iostream> // Для потокового введення-виведення
#include <conio> // Для консольного режиму роботи
using namespace std; // Використання стандартного простору імен
Специфікатор доступу protected оголошує захищені члени або забезпечує механізм успадкування захищеного класу.
Якщо член класу оголошений з використанням специфікатора доступу protected, то він не буде доступним для інших елементів програми, які не є членами цьо-
1 Проте члени с та сі, як і раніше, залишаються доступними для класу сіегЇуесіА.
1 Основне призначення директиви using - забезпечиш підтримку просторів імен.
2 Дозвіл подібних речей зруйнував би інкапсуляцію!
1 Насправді більшість С++ програмістів вважає такий стиль програмування невдалим
1 Пригадайте, що площа круга обчислюється за формулою 7iR2.
1 Окрім цього, початковій код програмі! не захаращується декількома "вручну" перевнзначенпмн версіями.
1 "Правильне" закінчення означає виконання стандартної послідовності дій після завершення роботи.
1 Тип size_t, по суті, - це цілочисельний тип без знаку.
1 Клас Ьазіс_іоз виведений з класу іоз_Ьазе, я кип визначає ряд нешаблонних властивостей, що використовуються класом Ьазіс_іоз.
1 У разі потреби другий параметр також може мати тип посилання на об'єкт.
1 Не буде перебільшенням наголосити на тому, що серед усіх відомих структурованих мов С-система введення-ви- ведення не має подібних до себе.
1 Див. додаток В, у якому представлено огляд С-орієнгованих функцій введення-виведення.
2 Точніше, ці значення визначено у класі ■ . який, як згадувалося вище, є базовим для класу .
1 Між цими і Вашими результатами можливо виникне розбіжність, спричинена використанням різних компіляторів.
1 pos_type tellg(); - повертає поточну позицію get-покажчика;
pos_type tellp(); - повертає поточну позицію put-покажчика.
У цих записах використовується тип pos_type (він визначений у класі ios), що дає змогу зберігати найбільше значення, яке може повернути будь-яка з цих функцій.
1 Ця функція призначена в основному для внутрішнього використання. Значення результату, який вона повертає, не має нічого спільного із успадкуванням або ієрархією класів.
1 Функцію, яка генерує об'єкти, іноді називають генератором об'єктів.
1 Якщо ж спроба виконати цю операцію виявилася невдалою за участі в ній посилань, генерується виняток типу ЬасІ_саз1.
1 Саме ця адреса використовується під час виклику функції.
2 Цей процес подібний до процесу отримання адреси масиву, коли також використовується тільки його ім'я без індексу.
1 Безумовно, звертатися можна також і через ім'я об'єкта.
2 Звичайно ж, статична функція-член класу може отримувати доступ до нестатечних глобальних даних і функцій.
1 Наприклад, у мові програмування C++ не передбачено настанови, яка могла б заборонити переривання.
1 Цю інформацію необхідно уточнити у документації, яка додається до Вашого компілятора.
1 Граді Буч (Grady Booch; *27 лютого 1955 р., Техас) - американський вчений в галузі інформаційних технологій і програмування. Автор класичних праць з об'єкгно-орієнгованого аналізу. Один з творців UML.
2 Джеймс Рамбо (англ. James Rumbaugh, народ. 1947 p.) - американський учений в області інформатики і об'єктної методології, найбільш відомий за своїми роботами над створенням технології об'єктного моделювання (ОМТ) і мови моделювання UML.
3 Як ми побачимо далі, ітерації зазвичай відповідають варіантам використання.
1 У програмі, насправді, мн використовуватимемо cout замість функції DisplayQ.
1 Для полегшення перекладу програм, написаних різними мовами у середовище .NET, у Microsoft розроблена проміжна мова - Microsoft Intermediate Language (MSIL). Аби відкомпілюваш додаток .NET, компілятори беруть початковий код і створюють з нього MSIL-код. MSIL - це повноцінна мова, придатна для написання будь-яких додатків. Проте, як у випаду з мовою Асемблер, користувачу навряд чи доведеться цим займатися, окрім деяких особливих обставин. Кожна група розробників компілятора вирішує, якою мірою він підтримуватиме MSIL. Але якщо творці компіляторів захочуть, аби їх мова повноцінно взаємодіяла з іншими мовами, їм доведеться обмежити себе рамками, які визначаються специфікаціями CLS.
2 Common Language Runtime (CLR) - "загальне середовище виконання мов" - це компонент пакету Microsoft .NET Framework, віртуальна машина, на якій виконуються всі мови платформи .NET Framework.
CLR транслюється початковий код в байг-код мовою IL, реалізація компіляції якого компанією Microsoft називається MSIL, а також надає MSIL-програмам (а отже, і програмам, написаних мовами високого рівня, що підгримують .NET Framework) доступ до бібліотеки класів .NET Framework, або так званою .NET FCL (англ. Framework Class Library).
Середовище CLR є реалізацією специфікації CLI (англ. Common Language Infrastructure), специфікації загаль- номовної інфраструктури, компанією Microsoft.
Віртуальна машина CLR дає змогу програмістам забути про багато деталей про конкретний процесор, на якому виконуватиметься програма. CLR також забезпечує такі важливі служби як: управління пам'яттю; управління потоками; оброблення винятків; збирання сміття; безпека виконання.