Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.08 Mб
Скачать

Навчальний посібник

Літературний редактор В. В. Дудок

Редактор Г.М. Падик Технічний редактор О.В. Хлевной Авторські комп'ютерний набір та верстка

Підписано до друку 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 prog­ramming); предметно-орієнтоване програмування (англ. 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 оголошує захищені члени або забезпе­чує механізм успадкування захищеного класу.

Якщо член класу оголошений з використанням специфікатора доступу protec­ted, то він не буде доступним для інших елементів програми, які не є членами цьо-

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 також забезпечує такі важливі служби як: управління пам'яттю; управ­ління потоками; оброблення винятків; збирання сміття; безпека виконання.