ISВN 966-0000-00-0 1 страница
Грицюк Ю.І.
Київ
Навчальний посібник
Юрій ГРИЦЮК
ОБ'ЄКТНО-ОРІЄНТОВАНЕ
ПРОГРАМУВАННЯ МОВОЮ С++
Видавництво "ЮНІОР"
ББК 32.973.26-01+18.2.75
Г85
УДК 681.3.07
Г 85 Об'єктно-орієнтоване програмування мовою С++: Навч. пос. – Київ: Вид-во "Юніор", 2006. – 464 с.: іл. 15, табл. 18.
Розглядаються особливості програмування мовою С++ – від основ програмування до об'єктно-орієнтованого. Спочатку детально проаналізовано основні елементи мови програмування С++, типи даних, настанови керування ходом виконання С++-програми, масиви та рядки як засоби для групування взаємопов'язаних між собою змінних, основи застосування покажчиків і функцій та розширення їх можливостей, додаткова інформація про типи даних і оператори, а також основні відомості про структури та об'єднання. Потім на конкретних прикладах вивчаються класи та робота з ними, перевантаження операторів і успадкування в класах, віртуальні функції та поліморфізм, шаблони в класах і оброблення виняткових ситуацій, С++-система введення-виведення, динамічна ідентифікація типів і оператори приведення типу, простір імен і інші ефективні програмні засоби, введення в стандартну бібліотеку шаблонів і особливості роботи препроцесора С++. У додатках наводиться С-орієнтована система введення-виведення, особливості використання застарілого С++-компілятора, а також .NET-розширення для C++.
Даний навчальний посібник написано на основі книг Герберта Шилдта [26-29] – визнаного авторитета в області програмування мовами С, С++, Java і C#, професійного Windows-програміста, члена комітету ANSI/ISO, що приймав стандарт для мови С і С++. Окрім того, в посібнику використано деякі матеріали з книги Роберта Лафоре [11], що стосуються використання об'єктно-орієнтованого підходу до розроблення сучасного програмного забезпечення.
Посібник призначено для студентів вищих навчальних закладів, що вивчають комп'ютерні науки, аспірантам і науковцям, а також розробникам програмного забезпечення.
ББК 32.973.26-01+18.2.75
Навчальне видання
Юрій Іванович ГРИЦЮК – канд. техн. наук, доц. каф. обчисл. техніки
і моделювання технологічних процесів НЛТУ України
Об'єктно-орієнтоване програмування мовою С++
Головний редактор Ю.С. КОВТАНЮК
Літературний редактор В.В. ДУДОК
Технічний редактор Т.М. КОВТАНЮК
Відповідальний редактор С.В. СОЛОВ'ЯН
Підписано до друку 00.00.06. Формат 70´100/16
Папір газетний. Гарнітура Times. Друк офсетний.
Умов. друк. арк. 37,54. Обл.-вид. арк. 25.10
Наклад 1500 прим. Зам. № 00/2006
Видавництво "Юніор", Україна, 03142, м. Київ, вул. Стуса, 35-37, оф. 111
тел./факс: (044) 452-82-22; e-mail: office@junior.com.ua; http://www.junior.com.ua
Свідоцтво про внесення суб'єкта видавничої справи до державного реєстру видавців,
виготовників і розповсюджувачів видавничої продукції серія ДК, № 368 від 20.03.2001 р.
Макет підготовлено редакційно видавничим відділом НЛТУ України,
79057, м. Львів, вул. Генерала Чупринки, 103/54
ISВN 966-0000-00-0 Ó Ю.І. Грицюк, 2006
Ó Видавництво "Юніор", 2006
СТИСЛИЙ ЗМІСТ
Про автора................................................................................................. 19
Передмова.................................................................................................. 20
Вступ............................................................................................................ 21
Частина І. Основи програмування мовою С++................................................................................. 26
Розділ 1. Історія виникнення мови програмування С++........... 27
Розділ 2. Основні елементи мови програмування С++.............. 34
Розділ 3. Основні типи даних у мові програмування C++......... 54
Розділ 4. Поняття про настанови керування ходом виконання С++-програми................................................................................. 71
Розділ 5. Масиви та рядки – засоби групування взаємопов'язаних між собою змінних..................................... 90
Розділ 6. Особливості застосування покажчиків....................... 109
Розділ 7. Основи застосування С++-функцій.............................. 128
Розділ 8. Використання засобів програмування для розширення можливостей С++-функцій............................. 153
Розділ 9. С++-специфікатори та спеціальні оператори............ 173
Розділ 10. Поняття про структури і об'єднання даних.............. 202
Частина ІІ. Об'єктно-орієнтоване програмування мовою С++...................... 227
Розділ 11. Основи розроблення об'єктно-орієнтованих програм мовою C++..................................................................................... 228
Розділ 12. Введення в класи.............................................................. 239
Розділ 13. Робота з класами............................................................... 263
Розділ 14. Перевантаження операторів.......................................... 285
Розділ 15. Успадкування в класах.................................................. 315
Розділ 16. Віртуальні функції та поліморфізм............................ 339
Розділ 17. Шаблони в класах............................................................ 353
Розділ 18. Оброблення виняткових ситуацій.............................. 370
Розділ 19. С++-система введення-виведення потокової інформації...................................................................................... 388
Розділ 20. Динамічна ідентифікація типів і оператори приведення типу.......................................................................... 420
Розділ 21. Поняття про простори імен і інші ефективні програмні засоби......................................................................... 436
Розділ 22. Введення в стандартну бібліотеку шаблонів........... 461
Розділ 23. Особливості роботи препроцесора С++..................... 500
Розділ 24. Формалізація процесу розроблення об'єктно-орієнтованого програмного забезпечення.......................... 511
Додатки. Доповнення до С++......................... 543
Додаток А. Основи створення консольних програм у середовищі Borland C++ Builder............................................. 544
Додаток Б. Основи створення консольних програм у середовищі Microsoft Visual C++............................................ 552
Додаток В. Дещо про С-систему введення-виведення.............. 558
Додаток Г. Особливості використання застарілого С++-компілятора.................................................................................. 572
Додаток Д. .NET-розширения для C++........................................... 574
Література............................................................................................... 577
ЗМІСТ
Про автора........................................................................ 19
Передмова......................................................................... 20
Вступ.................................................................................... 21
Частина І. Основи програмування мовою С++................................................................................. 26
Розділ 1. Історія виникнення мови програмування С++........................................... 27
1.1. Витоки мови програмування C++.............................................. 27
1.1.1. Причини створення мови програмування С.......................... 27
1.1.2. Передумови виникнення мови програмування C++............. 29
1.1.3. Поява мови програмування C++............................................. 30
1.1.4. Етапи вдосконалення мови програмування C++................... 30
1.2. Основні ознаки об'єктно-орієнтованого програмування.. 31
1.2.1. Поняття про інкапсуляцію........................................................ 31
1.2.2. Поняття про поліморфізм......................................................... 32
1.2.3. Поняття про успадкування....................................................... 32
1.2.4. Мова програмування C++ і реалізація об'єктно-орієнтованого програмування.......................................................................... 33
1.2.5. Зв'язок мови програмування C++ з мовами Java і С#............ 33
Розділ 2. Основні елементи мови програмування С++........................................... 34
2.1. Розроблення найпростішої С++-програми.............................. 34
2.1.1. Введення коду програми.......................................................... 35
2.1.2. Компілювання програми.......................................................... 35
2.1.3. Виконання програми................................................................ 35
2.1.4. Порядкóвий аналіз програми................................................... 36
2.1.5. Оброблення синтаксичних помилок....................................... 38
2.2. Розроблення реальної навчальної програми......................... 39
2.2.1. Присвоєнням значень змінним................................................ 39
2.2.2. Введення даних у програму..................................................... 40
2.2.3. Деякі можливості виведення даних......................................... 41
2.2.4. Введення нового типу даних................................................... 41
2.3. Функції – "будівельні блоки" С++-програми........................ 42
2.3.1. Основні поняття про функції................................................... 42
2.3.2. Загальний формат С++-функцій.............................................. 44
2.3.3. Передавання аргументів функції............................................. 44
2.3.4. Повернення функціями аргуметів........................................... 46
2.3.5. Спеціальна функція main()................................................... 47
2.4. Поняття про логічну та циклічну настанови......................... 47
2.4.1. Логічна настанова if............................................................... 47
2.4.2. Циклічна настанова for.......................................................... 48
2.5. Структуризація С++-програми................................................... 50
2.5.1. Поняття про блоки програми................................................... 50
2.5.2. Використання крапки з комою і розташування настанов..... 51
2.5.3. Практика застосування відступів............................................ 51
2.6. Елементи визначення мови програмування C++................. 51
2.6.1. Поняття про ключові слова...................................................... 51
2.6.2. Розроблення ідентифікаторів користувача............................. 52
2.6.3. Використання стандартної бібліотеки.................................... 52
Розділ 3. Основні типи даних у мові програмування C++........................................... 54
3.1. Оголошення змінних...................................................................... 55
3.1.1. Локальні змінні.......................................................................... 55
3.1.2. Формальні параметри................................................................ 56
3.1.3. Глобальні змінні......................................................................... 56
3.2. Модифікатори типів даних.......................................................... 57
3.3. Поняття про літерали..................................................................... 60
3.3.1. Шістнадцяткові та вісімкові літерали...................................... 61
3.3.2. Рядкові літерали......................................................................... 61
3.3.3. Символьні керівні послідовності............................................. 61
3.4. Ініціалізація змінних...................................................................... 62
3.5. Оператори С++-програми............................................................. 63
3.5.1. Поняття про вбудовані оператори........................................... 63
3.5.2. Арифметичні оператори........................................................... 64
3.5.3. Оператори інкремента і декремента........................................ 65
3.5.4. Історія походження імені мови програмування C++............. 66
3.5.5. Оператори відношення та логічні оператори......................... 66
3.6. Запис арифметичних виразів...................................................... 68
3.6.1. Перетворення типів у виразах................................................. 68
3.6.2. Перетворення, що відбуваються під час використання типу bool........................................................................................... 69
3.6.3. Операція приведення типів даних........................................... 69
Розділ 4. Поняття про настанови керування ходом виконання С++-програми.............. 71
4.1. Використання настанови вибору if......................................... 71
4.1.1. Умовний вираз........................................................................... 72
4.1.2. Вкладені if-настанови............................................................. 73
4.1.3. Конструкція if-else-if...................................................... 74
4.2. Використання настанови багатовибірного розгалуження switch............................................................................................... 75
4.2.1. Особливості роботи настанови................................................ 75
4.2.2. Організація вкладених настанов багатовибірного розгалуження............................................................................. 78
4.3. Використання настанови організації циклу for.................. 78
4.3.1. Варіанти використання настанови організації циклу for... 80
4.3.2. Відсутність елементів у визначенні циклу............................. 81
4.3.3. Нескінченний цикл................................................................... 82
4.3.4. Цикли часової затримки........................................................... 82
4.4. Використання інших ітераційних настанов........................... 82
4.4.1. Ітераційна настанова while................................................... 82
4.4.2. Ітераційна настанова do-while............................................ 84
4.4.3. Використання настанови переходу continue................... 85
4.4.4. Використання настанови break для виходу з циклу.......... 85
4.4.5. Організація вкладених циклів.................................................. 87
4.5. Використання настанови безумовного переходу goto...... 87
4.6. Приклад використання настанов керування......................... 88
Розділ 5. Масиви та рядки – засоби групування взаємопов'язаних між собою змінних.................................................... 90
5.1. Одновимірні масиви....................................................................... 90
5.1.1. На межах масивів "прикордонної застави" немає.................. 92
5.1.2. Сортування масиву................................................................... 92
5.2. Побудова символьних рядків...................................................... 94
5.2.1. Оголошення рядкового літерала.............................................. 94
5.2.2. Зчитування рядків з клавіатури............................................... 94
5.3. Застосування бібліотечних функцій для оброблення рядків.............................................................................................................. 96
5.3.1. Використання функції strcpy()......................................... 96
5.3.2. Використання функції strcpy()......................................... 96
5.3.3. Використання функції strcmp()......................................... 97
5.3.4. Використання функції strlen()......................................... 98
5.3.5. Використання ознаки завершення рядка................................ 99
5.4. Дво- та багатовимірні масиви................................................... 100
5.4.1. Двовимірні масиви.................................................................. 100
5.4.2. Багатовимірні масиви............................................................. 101
5.5. Ініціалізація масивів.................................................................... 102
5.5.1. Ініціалізація "розмірних" масивів.......................................... 102
5.5.2. "Безрозмірна" ініціалізація масивів........................................ 105
5.6. Масиви рядків................................................................................ 105
5.6.1. Побудова масивів рядків........................................................ 106
5.6.2. Приклад використання масивів рядків................................. 106
Розділ 6. Особливості застосування покажчиків.......................................................... 109
6.1. Основні поняття про покажчики............................................. 109
6.2. Використання покажчиків з операторами присвоєння.... 110
6.2.1. Оператори роботи з покажчиками........................................ 110
6.2.2. Важливість застосування базового типу покажчика........... 111
6.2.3. Присвоєння значень за допомогою покажчиків.................. 112
6.3. Використання покажчиків у виразах..................................... 113
6.3.1. Арифметичні операції над покажчиками............................. 113
6.3.2. Порівняння покажчиків.......................................................... 115
6.4. Покажчики і масиви.................................................................... 115
6.4.1. Основні відмінності між індексуванням елементів масивів і арифметичними операціями над покажчиками................... 116
6.4.2. Індексування покажчика........................................................ 118
6.4.3. Взаємозамінність покажчиків і масивів................................ 118
6.4.4. Масиви покажчиків................................................................. 119
6.4.5. Покажчики і рядкові літерали................................................ 121
6.4.5. Приклад порівняння покажчиків........................................... 122
6.5. Ініціалізація покажчиків............................................................ 123
6.5.1. Домовленість про нульові покажчики.................................. 123
6.5.2. Покажчики і 16-розрядні середовища................................... 123
6.5.3. Багаторівнева непряма адресація........................................... 124
6.6. Виникнення проблем під час використання покажчиків 125
6.6.1. Неініціалізовані покажчики................................................... 125
6.6.2. Некоректне порівняння покажчиків..................................... 125
6.6.3. Не встановлення покажчиків................................................. 126
Розділ 7. Основи застосування С++-функцій 128
7.1. Правила дії областей видимості функцій............................. 128
7.1.1. Локальні змінні........................................................................ 128
7.1.2. Оголошення змінних в ітераційних настановах і настановах вибору...................................................................................... 132
7.1.3. Формальні параметри.............................................................. 133
7.1.4. Глобальні змінні....................................................................... 133
7.2. Передача покажчиків і масивів як аргументів функціям........................................................................................................... 135
7.2.1. Виклик функцій з покажчиками............................................ 135
7.2.2. Виклик функцій з масивами.................................................. 136
7.2.3. Передача функціям рядків...................................................... 139
7.3. Аргументи функції main(): argc і argv.............................. 140
7.3.1. Передача програмі числових аргументів командного рядка................................................................................................... 142
7.3.2. Перетворення числових рядків у числа................................ 143
7.4. Використання у функціях настанови return..................... 144
7.4.1. Завершення роботи функції.................................................... 144
7.4.2. Повернення значень................................................................ 144
7.4.3. Функції, які не повертають значень (void-функції)........... 146
7.4.4. Функції, які повертають покажчики..................................... 147
7.4.5. Прототипи функцій................................................................. 148
7.4.6. Грунтовніше про заголовки у C++-програмах..................... 149
7.4.7. Організація рекурсивних функцій......................................... 150
Розділ 8. Використання засобів програмування для розширення можливостей С++-функцій........................ 153
8.1. Способи передачі аргументів функціям................................ 153
8.1.1. Механізм передачі аргументів у мові програмування C++. 153
8.1.2. Використання покажчика для забезпечення виклику за посиланням.............................................................................. 154
8.2. Посилальні параметри................................................................ 155
8.2.1. Механізм дії посилальних параметрів................................... 156
8.2.2. Варіанти оголошень посилальних параметрів..................... 158
8.2.3. Повернення посилань............................................................. 158
8.2.4. Створення обмеженого (безпечного) масиву....................... 161
8.2.5. Поняття про незалежні посилання........................................ 162
8.2.6. Врахування обмежень під час використання посилань...... 163
8.2.7. Перевантаження функцій....................................................... 163
8.2.8. Поняття про ключове слово overload.............................. 166
8.3. Передача аргументів функції за замовчуванням............... 166
8.3.1. Можливі випадки передачі аргументів функції за замовчуванням........................................................................ 167
8.3.2. Порівняння можливості передачі аргументів функції за замовчуванням з її перевантаженням................................... 168
8.3.3. Особливості використання аргументів, що передаються функції за замовчуванням...................................................... 169
8.4. Перевантаження функцій і неоднозначності, що при цьому виникають..................................................................................... 170
Розділ 9. С++-специфікатори та спеціальні оператори............................................................. 173
9.1. Специфікатори типів даних....................................................... 173
9.1.1. Застосування специфікатора типу даних const................ 173
9.1.2. Застосування специфікатора типу даних volatile......... 175
9.2. Специфікатори класів пам'яті.................................................. 176
9.2.1. Застосування специфікатора класу пам'яті auto................ 176
9.2.2. Застосування специфікатора класу пам'яті extern........... 177
9.2.3. Статичні змінні........................................................................ 178
9.2.4. Регістрові змінні...................................................................... 181
9.2.5. Походження модифікатора register................................ 182
9.3. Порозрядні оператори.................................................................. 184
9.3.1. Порозрядні оператори І, АБО, що виключає АБО і НЕ...... 184
9.3.2. Оператори зсуву...................................................................... 187
9.4. Спеціальні оператори розширення можливостей мови С++........................................................................................................... 189
9.4.1. Перерахунки – списки іменованих цілочисельних констант................................................................................................... 189
9.4.2. Створення нових імен для наявних типів даних................. 191
9.4.3. Оператор "знак запитання"..................................................... 192
9.4.4. Складені оператори присвоєння............................................ 193
9.4.5. Оператор "кома"...................................................................... 194
9.4.6. Декілька присвоєнь "в одному"............................................. 194
9.4.7. Використання ключового слова sizeof............................ 195
9.5. С++-система динамічного розподілу пам'яті...................... 196
9.5.1. Оператори динамічного розподілу пам'яті........................... 196
9.5.2. Ініціалізація динамічно виділеної пам'яті............................. 198
9.5.3. Динамічне виділення пам'яті для масивів............................. 198
9.5.4. Функції виділення та звільнення пам'яті у мові програмування С..................................................................... 199
9.6. Зведена таблиця пріоритетів виконання С++-операторів 201
Розділ 10. Поняття про структури і об'єднання даних........................................................................ 202
10.1. Робота зі структурами............................................................... 202
10.1.1. Основні положення............................................................... 202
10.1.2. Доступ до членів структури................................................. 204
10.1.3. Масиви структур................................................................... 205
10.1.4. Приклад застосування структури........................................ 205
10.1.5. Присвоєння структур............................................................ 210
10.1.6. Передача структури функції як аргументу......................... 211
10.1.7. Повернення функцією структури як значення................... 212
10.2. Використання покажчиків на структури і оператора "стрілка"........................................................................................ 213
10.2.1. Особливості використання покажчиків на структури...... 214
10.2.2. Приклад використання покажчиків на структури............. 214
10.3. Посилання на структури.......................................................... 216
10.3.1. Використання структур під час передачі функції параметрів за посиланням.......................................................................... 217
10.3.2. Використання як членів структур масивів і структур....... 218
10.3.3. Порівняння С- і С++-структур............................................. 219
10.4. Бітові поля структур.................................................................. 219
10.5. Особливості використання об'єднань.................................. 221
10.5.1. Оголошення об'єднання........................................................ 221
10.5.2. Анонімні об'єднання............................................................. 225
10.5.3. Використання оператора sizeof для гарантії переносності коду програми......................................................................... 226
Частина ІІ. Об'єктно-орієнтоване програмування мовою С++...................... 227
Розділ 11. Основи розроблення об'єктно-орієнтованих програм мовою C++........ 228
11.1. Потреба об'єктно-орієнтованого програмування............ 228
11.1.1. Процедурні мови програмування........................................ 228
11.1.2. Поділ програми на функції................................................... 228