- •79057, М. Львів, вул. Генерала Чупринки, 103/54
- •Стислий зміст
- •1.2. Основні ознаки об'єктно-орієнтованого програмування 31
- •2.2. Розроблення реальної навчальної програми 40
- •2.4. Поняття про логічну та циклічну настанови 49
- •17.1. Поняття про узагальнені функції 364
- •17.2. Узагальнені класи 371
- •1.1.1. Причини створення мови програмування с
- •1.2. Основні ознаки об'єктно-орієнтованого програмування
- •1.2.1. Поняття про інкапсуляцію
- •1.2.2. Поняття про поліморфізм
- •1.2.3. Поняття про успадкування
- •2.1.1. Введення коду програми
- •2.1.2. Компілювання програми
- •2.1.3. Виконання програми
- •2.1.4. Порядкóвий аналіз програми
- •2.1.5. Оброблення синтаксичних помилок
- •2.2. Розроблення реальної навчальної програми
- •2.2.1. Присвоєнням значень змінним
- •2.2.2. Введення даних у програму
- •2.2.3. Деякі можливості виведення даних
- •2.2.4. Введення нового типу даних
- •2.3.1. Основні поняття про функції
- •2.3.3. Передавання аргументів функції
- •2.3.4. Повернення функціями аргуметів
- •2.3.5. Спеціальна функція main()
- •2.4. Поняття про логічну та циклічну настанови
- •2.4.1. Логічна настанова if
- •2.4.2. Циклічна настанова for
- •2.5.1. Поняття про блоки програми
- •2.5.2. Використання крапки з комою і розташування настанов
- •2.5.3. Практика застосування відступів
- •2.6.1. Поняття про ключові слова
- •2.6.2. Розроблення ідентифікаторів користувача
- •2.6.3. Використання стандартної бібліотеки
- •3.1. Оголошення змінних
- •3.1.1. Локальні змінні
- •3.1.2. Формальні параметри
- •3.1.3. Глобальні змінні
- •3.2. Модифікатори типів даних
- •3.3. Поняття про літерали
- •3.3.1. Шістнадцяткові та вісімкові літерали
- •3.3.2. Рядкові літерали
- •3.3.3. Символьні керівні послідовності
- •3.4. Ініціалізація змінних
- •3.5.1. Поняття про вбудовані оператори
- •3.5.2. Арифметичні оператори
- •3.5.3. Оператори інкремента і декремента
- •3.5.5. Оператори відношення та логічні оператори
- •3.6. Запис арифметичних виразів
- •3.6.1. Перетворення типів у виразах
- •3.6.2. Перетворення, що відбуваються під час використання типу bool
- •3.6.3. Операція приведення типів даних
- •3.6.4. Використання пропусків і круглих дужок
- •4.1. Використання настанови вибору if
- •4.1.1. Умовний вираз
- •4.1.2. Вкладені if-настанови
- •4.1.3. Конструкція if-else-if
- •4.2. Використання настанови багатовибірного розгалуження switch
- •4.2.1. Особливості роботи настанови
- •4.2.2. Організація вкладених настанов багатовибірного розгалуження
- •4.3. Використання настанови організації циклу for
- •4.3.1. Варіанти використання настанови організації циклу for
- •4.3.2. Відсутність елементів у визначенні циклу
- •4.3.3. Нескінченний цикл
- •4.3.4. Цикли часової затримки
- •4.4. Використання інших ітераційних настанов
- •4.4.1. Ітераційна настанова while
- •4.4.2. Ітераційна настанова do-while
- •4.4.3. Використання настанови переходу continue
- •4.4.4. Використання настанови break для виходу з циклу
- •4.4.5. Організація вкладених циклів
- •4.5. Використання настанови безумовного переходу goto
- •4.6. Приклад використання настанов керування
- •5.1. Одновимірні|одномірні| масиви
- •5.1.1. На межах масивів "прикордонної застави" немає
- •5.1.2. Сортування масиву
- •5.2. Побудова символьних рядків
- •5.2.1. Оголошення рядкового літерала
- •5.2.2. Зчитування рядків з клавіатури
- •5.3. Застосування бібліотечних функцій для оброблення рядків
- •5.3.1. Використання функції strcpy()
- •5.3.2. Використання функції strcpy()
- •5.3.3. Використання функції strcmp()
- •5.3.4. Використання функції strlen()
- •5.3.5. Використання ознаки завершення рядка
- •5.4.1. Двовимірні масиви
- •5.4.2. Багатовимірні|багатомірні| масиви
- •5.5. Ініціалізація масивів
- •5.5.1. Ініціалізація "розмірних" масивів
- •5.5.2. "Безрозмірна" ініціалізація масивів
- •5.6. Масиви рядків
- •5.6.1. Побудова масивів рядків
- •5.6.2. Приклад використання масивів рядків
- •6.1. Основні поняття про покажчики
- •6.2. Використання|із| покажчиків з операторами присвоєння
- •6.2.1. Оператори роботи з покажчиками
- •6.2.2. Важливість застосування базового типу покажчика
- •6.2.3. Присвоєння значень за допомогою покажчиків
- •6.3. Використання покажчиків у виразах
- •6.3.1. Арифметичні операції над покажчиками
- •6.3.2. Порівняння покажчиків
- •6.4. Покажчики і масиви
- •6.4.1. Основні відмінності між індексуванням елементів масивів і арифметичними операціями над покажчиками
- •6.4.2. Індексування покажчика
- •6.4.3. Взаємозамінність покажчиків і масивів
- •6.4.4. Масиви покажчиків
- •6.4.5. Покажчики і рядкові літерали
- •6.4.5. Приклад порівняння покажчиків
- •6.5. Ініціалізація покажчиків
- •6.5.1. Домовленість про нульові покажчики
- •6.5.2. Покажчики і 16-розрядні середовища
- •6.5.3. Багаторівнева непряма адресація
- •6.6. Виникнення проблем під час використання покажчиків
- •6.6.1. Неініціалізовані покажчики
- •6.6.2. Некоректне порівняння покажчиків
- •6.6.3. Не встановлення покажчиків
- •7.1. Правила дії областей видимості функцій
- •7.1.1. Локальні змінні
- •7.1.2. Оголошення змінних в ітераційних настановах і настановах вибору
- •7.1.3. Формальні параметри
- •7.1.4. Глобальні змінні
- •7.2. Передача покажчиків і масивів як аргументів функціям
- •7.2.1. Виклик функцій з покажчиками
- •7.2.2. Виклик функцій з масивами
- •7.2.3. Передача функціям рядків
- •7.3. Аргументи функції main(): argc і argv
- •7.3.1. Передача програмі числових аргументів командного рядка
- •7.3.2. Перетворення числових рядків у числа
- •7.4. Використання у функціях настанови return
- •7.4.1. Завершення роботи функції
- •7.4.2. Повернення значень
- •7.4.3. Функції, які не повертають значень (void-функції)
- •7.4.4. Функції, які повертають покажчики
- •7.4.5. Прототипи функцій
- •7.4.7. Організація рекурсивних функцій
- •8.1. Способи передачі аргументів функціям
- •8.1.2. Використання покажчика для забезпечення виклику за посиланням
- •8.2. Посилальні параметри
- •8.2.1. Механізм дії посилальних параметрів
- •8.2.2. Варіанти оголошень посилальних параметрів
- •8.2.3. Повернення посилань
- •8.2.4. Створення обмеженого (безпечного) масиву
- •8.2.5. Поняття про незалежні посилання
- •8.2.6. Врахування обмежень під час використання посилань
- •8.2.7. Перевантаження функцій
- •8.2.8. Поняття про ключове слово overload
- •8.3. Передача аргументів функції за замовчуванням
- •8.3.1. Можливі випадки передачі аргументів функції за замовчуванням
- •8.3.2. Порівняння можливості передачі аргументів функції за замовчуванням з її перевантаженням
- •8.3.3. Особливості використання аргументів, що передаються функції за замовчуванням
- •8.4. Перевантаження функцій і неоднозначності, що при цьому виникають
- •9.1. Специфікатори типів даних
- •9.1.1. Застосування специфікатора типу даних const
- •9.1.2. Застосування специфікатора типу даних volatile
- •9.2. Специфікатори класів пам'яті
- •9.2.1. Застосування специфікатора класу пам'яті auto
- •9.2.2. Застосування специфікатора класу пам'яті extern
- •9.2.3. Статичні змінні
- •9.2.4. Регістрові змінні
- •9.2.5. Походження модифікатора register
- •9.3. Порозрядні оператори
- •9.3.1. Порозрядні оператори і, або, що виключає або і не
- •9.3.2. Оператори зсуву
- •9.4.1. Перерахунки – списки іменованих цілочисельних констант
- •9.4.2. Створення нових імен для наявних типів даних
- •9.4.3. Оператор "знак запитання"
- •9.4.4. Складені оператори присвоєння
- •9.4.5. Оператор "кома"
- •9.4.6. Декілька присвоєнь "в одному"
- •9.4.7. Використання ключового слова sizeof
- •9.5.1. Оператори динамічного розподілу пам'яті
- •9.5.2. Ініціалізація динамічно виділеної пам'яті
- •9.5.3. Динамічне виділення пам'яті для масивів
- •9.5.4. Функції виділення та звільнення пам'яті у мові програмування с
- •10.1. Робота зі структурами
- •10.1.1. Основні положення
- •10.1.2. Доступ до членів структури
- •10.1.3. Масиви структур
- •10.1.4. Приклад застосування структури
- •10.1.5. Присвоєння структур
- •10.1.6. Передача структури функції як аргументу
- •10.1.7. Повернення функцією структури як значення
- •10.2. Використання покажчиків на структури і оператора "стрілка"
- •10.2.1. Особливості використання покажчиків на структури
- •10.2.2. Приклад використання покажчиків на структури
- •10.3. Посилання на структури
- •10.3.1. Використання структур під час передачі функції параметрів за посиланням
- •10.3.2. Використання як членів структур масивів і структур
- •10.4. Бітові поля структур
- •10.5. Особливості використання об'єднань
- •10.5.1. Оголошення об'єднання
- •10.5.2. Анонімні об'єднання
- •10.5.3. Використання оператора sizeof для гарантії переносності коду програми
- •11.1. Потреба об'єктно-орієнтованого програмування
- •11.1.1. Процедурні мови програмування
- •11.1.2. Поділ програми на функції
- •11.1.3. Недоліки структурного програмування
- •11.1.4. Неконтрольований доступ до даних
- •11.1.5. Відображення картини реального світу
- •11.2. Поняття про об'єктно-орієнтований підхід
- •11.2.1. Виробнича аналогія
- •11.3. Основні компоненти об'єктно-орієнтованої мови програмування
- •11.3.1. Поділ програми на об'єкти
- •11.3.2. Визначення класу
- •11.3.3. Поняття про успадкування в класах
- •11.3.4. Повторне використання коду
- •11.3.5. Поняття про типи даних користувача
- •11.3.6. Поняття про поліморфізм і перевантаження операторів
- •11.5. Вивчення основ створення об'єктно-орієнтованих програм
- •11.6. Поняття про універсальну мову моделювання
- •12.1. Базові поняття класу
- •12.2. Конструктори і деструктори
- •12.2.1. Параметризовані конструктори
- •12.2.2. Альтернативний варіант ініціалізації членів-даних об'єкта
- •12.3. Доступ до членів класу
- •12.4. Класи і структури – споріднені типи
- •12.5. Об'єднання і класи – споріднені типи
- •12.6. Вбудовувані функції
- •12.7. Створення масивів об'єктів
- •12.8. Покажчики на об'єкти
- •13.1. Поняття про функції-"друзі" класу
- •13.2. Перевантаження конструкторів
- •13.3. Динамічна ініціалізація конструктора
- •13.4. Присвоєння об'єктів
- •13.5. Передача об'єктів функціям
- •13.5.1. Конструктори, деструктори і передача об'єктів
- •13.5.2. Потенційні проблеми під час передачі параметрів
- •13.6. Повернення об'єктів функціями
- •13.7. Створення і використання конструктора копії
- •13.7.1. Використання конструктора копії для ініціалізації одного об'єкта іншим
- •13.7.2. Використання конструктора копії для передачі об'єкта функції
- •13.7.3. Використання конструктора копії під час повернення функцією об'єкта
- •13.7.4. Конструктори копії – а чи не можна знайти щось простіше?
- •13.8. Ключове слово this
- •14.1. Перевантаження операторів з використанням функцій-членів класу
- •14.1.3. Особливості реалізації механізму перевантаження операторів
- •14.1.4. Значення порядку слідування операндів
- •14.2. Перевантаження операторів з використанням функцій-не членів класу
- •14.2.1. Використання функцій-"друзів" класу для перевантаження бінарних операторів
- •14.2.2. Використання функцій-"друзів" класу для перевантаження унарних операторів
- •14.2.3. Перевантаження операторів відношення та логічних операторів
- •14.3. Особливості реалізації оператора присвоєння
- •14.4. Перевантаження оператора індексації масивів ([])
- •14.5. Перевантаження оператора "()"
- •14.6. Перевантаження інших операторів
- •14.6.1. Приклад перевантаження операторів класу рядків
- •15.1. Поняття про успадкування
- •15.2. Керування доступом до членів базового класу
- •15.3. Використання захищених членів класу
- •15.3.1. Використання специфікатора доступу protected для надання членам класу статусу захищеності
- •15.3.2. Використання специфікатора protected для успадкування базового класу
- •15.3.3. Узагальнення інформації про використання специфікаторів public, protected і private
- •15.4. Успадкування декількох базових класів
- •15.5. Використання конструкторів і деструкторів під час реалізації механізму успадкування
- •15.5.1. Прядок виконання конструкторів і деструкторів
- •15.5.2. Передача параметрів конструкторам базового класу
- •15.6. Повернення успадкованим членам початкової специфікації доступу
- •15.7. Віртуальні базові класи
- •16.1. Покажчики на похідні типи – підтримка динамічного поліморфізму
- •16.2. Віртуальні функції
- •16.2.1. Поняття про віртуальні функції
- •16.2.2. Успадкування віртуальних функцій
- •16.2.3. Потреба у застосуванні віртуальних функцій
- •16.2.4. Приклад застосування віртуальних функцій
- •16.2.5. Суто віртуальні функції та абстрактні класи
- •16.2.6. Порівняння раннього зв'язування з пізнім
- •16.2.7. Поняття про поліморфізм і пуризм
- •17.1. Поняття про узагальнені функції
- •17.1.1. Шаблонна функція з одним узагальненим типом
- •17.1.2. Шаблонна функція з двома узагальненими типами
- •17.1.3. Безпосередньо задане перевантаження узагальненої функції
- •17.1.4. Перевантаження шаблону функції
- •17.1.5. Використання стандартних параметрів у шаблонних функціях
- •17.1.6. Обмеження, які застосовуються під час використання узагальнених функцій
- •17.1.7. Приклад створення узагальненої функції abs()
- •17.2. Узагальнені класи
- •17.2.1. Створення класу з одним узагальненим типом даних
- •17.2.2. Створення класу з двома узагальненими типами даних
- •17.2.3. Створення узагальненого класу для організації безпечного масиву
- •17.2.4. Використання в узагальнених класах аргументів, що не є типами
- •17.2.5. Використання в шаблонних класах аргументів за замовчуванням
- •17.2.6. Безпосередньо задані спеціалізації класів
- •18.1. Основи оброблення виняткових ситуацій
- •18.1.1. Системні засоби оброблення винятків
- •18.1.2. Використання функцій exit() і abort() для завершення роботи програми
- •18.1.3. Перехоплення винятків класового типу
- •18.1.4. Використання декількох catch-настанов
- •18.2. Варіанти оброблення винятків
- •18.2.1. Перехоплення всіх винятків
- •18.2.2. Обмеження, що накладаються на тип винятків, які генеруються функціями
- •18.2.3. Повторне генерування винятку
- •18.3. Оброблення винятків, згенерованих оператором new
- •18.4. Перевантаження операторів new і delete
- •19.2.3. Класи потоків
- •19.3. Перевантаження операторів введення-виведення даних
- •19.3.1. Створення перевантажених операторів виведення даних
- •19.3.2. Використання функцій-"друзів" класу для перевантаження операторів виведення даних
- •19.3.3. Створення перевантажених операторів введення даних
- •19.4. Форматоване введення-виведення даних
- •19.4.1. Форматування даних з використанням функцій-членів класу ios
- •19.4.2. Встановлення ширини поля, точності та символів заповнення
- •19.4.3. Використання маніпуляторів введення-виведення даних
- •19.4.4. Створення власних маніпуляторних функцій
- •19.5. Файлове введення-виведення даних
- •19.5.1. Відкриття та закриття файлу
- •19.5.2. Зчитування і запис текстових файлів
- •19.5.3. Неформатоване введення-виведення даних у двійковому режимі
- •19.5.4. Зчитування і запис у файл блоків даних
- •19.5.6. Приклад порівняння файлів
- •19.5.7. Використання інших функцій для двійкового введення-виведення
- •19.5.8. Перевірка статусу введення-виведення
- •19.6. Використання файлів довільного доступу
- •19.6.1. Функції довільного доступу
- •19.6.2. Приклади використання довільного доступу до вмісту файлу
- •19.7. Використання перевантажених операторів введення-виведення даних під час роботи з файлами
- •20.1. Динамічна ідентифікація типів (rtti)
- •20.1.1. Отримання типу об'єкта у процесі виконання програми
- •20.1.2. Приклад rtti-застосування
- •20.1.3. Застосування оператора typeid до шаблонних класів
- •20.2. Оператори приведення типів
- •20.2.1. Оператор приведення поліморфних типів dynamic_cast
- •20.2.2. Оператор перевизначення модифікаторів const_cast
- •20.2.3. Оператор неполіморфного приведення типів static_cast
- •20.2.4. Оператор перетворення типу reinterpret_cast
- •20.2.5. Порівняння звичайної операції приведення типів з новими чотирма cast-операторами
- •21.1. Простори імен
- •21.1.1. Поняття про простори імен
- •21.1.2. Застосування настанови using
- •21.1.3. Неіменовані простори імен
- •21.1.4. Застосування простіру імен std
- •21.2. Застосування покажчиків на функції
- •21.2.1. Передача покажчиком на функцію її адреси іншій функції
- •21.2.2. Пошук адреси перевантаженої функції
- •21.3. Поняття про статичні члени-даних класу
- •21.5. Застосування до функцій-членів класу модифікаторів const і mutable
- •21.6. Використання explicit-конструкторів
- •21.7. Синтаксис ініціалізації членів-даних класу
- •21.8. Використання ключового слова asm
- •21.9. Специфікатор компонування функцій
- •21.11. Створення функцій перетворення
- •22.1. Огляд стандартної бібліотеки шаблонів
- •22.2. Поняття про контейнерні класи
- •22.3. Робота з векторами
- •22.3.1. Доступ до вектора за допомогою ітератора
- •22.3.2. Вставлення та видалення елементів з вектора
- •22.3.3. Збереження у векторі об'єктів класу
- •22.3.4. Доцільність використання ітераторів
- •22.4. Робота зі списками
- •22.4.1. Використання базових операцій для роботи зі списком
- •22.4.2. Сортування списку
- •22.4.3. Об'єднання одного списку з іншим
- •22.4.4. Зберігання у списку об'єктів класу
- •22.5. Поняття про відображення
- •22.5.1. Робота з відображеннями
- •22.5.2. Зберігання у відображенні об'єктів класу
- •22.6. Алгоритми оброблення контейнерних даних
- •22.6.1. Підрахунок кількості елементів
- •22.6.2. Видалення і заміна елементів
- •22.6.3. Реверсування послідовності
- •22.6.4. Перетворення послідовності
- •22.6.5. Дослідження алгоритмів
- •22.7. Використання класу string
- •22.7.1. Огляд функцій-членів класу string
- •22.7.2. Зберігання рядків у інших контейнерах
- •23.1.1. Директива #define
- •23.1.2. Директива #error
- •23.1.3. Директива #include
- •23.2. Директиви умовного компілювання
- •23.2.1. Директиви #if, #else, #elif і #endif
- •23.2.2. Директиви #ifdef і #ifndef
- •23.2.3. Директива #undef
- •23.2.4. Використання оператора defined
- •23.2.5. Про значення препроцесора
- •23.2.6. Директива #line
- •23.2.7. Директива #pragma
- •23.3. Оператори препроцесора "#" і "##"
- •23.4. Зарезервовані макроімена
- •23.5. Деякі поради студентам
- •24.1. Удосконалення процесу розроблення програмного забезпечення
- •24.1.1. Безпосередній процес розроблення пз
- •24.1.2. Каскадний процес розроблення пз
- •24.1.3. Використання ооп
- •24.1.4. Сучасні підходи до розроблення пз
- •24.2. Моделювання варіантів використання
- •24.2.1. Поняття про діючі суб'єкти
- •24.2.2. Поняття про варіанти використання
- •24.2.3. Поняття про сценарії
- •24.2.4. Застосування діаграм варіантів використання
- •24.2.5. Описи варіантів використання
- •24.2.6. Перехід від варіантів використання до класів
- •24.3. Предметна область програмування
- •24.3.1. Рукописні форми
- •24.3.2. Прийняття допущень і спрощень
- •24.4. Програма landlord: етап удосконалення
- •24.4.1. Встановлення діючих суб'єктів
- •24.4.2. З'ясування варіантів використання
- •24.4.3. Опис варіантів використання
- •24.4.4. Передбачення додаткових сценаріїв
- •24.4.5. Використання діаграм дій uml
- •24.5. Перехід від варіантів використання до класів
- •24.5.1. Аналіз переліку іменників з опису варіантів використання
- •24.5.2. Уточнення переліку іменників
- •24.5.3. Визначення атрибутів
- •24.5.4. Перехід від дієслів до повідомлень
- •24.5.5. Побудова діаграм класів
- •24.5.6. Побудова діаграм послідовностей
- •24.6. Кроки написання коду програми
- •24.6.1. Написання заголовного файлу
- •24.6.2. Створення початкових *.Срр файлів
- •24.6.3. Вимушені спрощення коду програми
- •24.6.4. Взаємодія користувача з програмою
- •24.6.5. Труднощі написання коду програми
- •24.7. Резюме
17.1. Поняття про узагальнені функції 364
17.1.1. Шаблонна функція з одним узагальненим типом 365
17.1.2. Шаблонна функція з двома узагальненими типами 366
17.1.3. Безпосередньо задане перевантаження узагальненої функції 367
17.1.4. Перевантаження шаблону функції 369
17.1.5. Використання стандартних параметрів у шаблонних функціях 369
17.1.6. Обмеження, які застосовуються під час використання узагальнених функцій 370
17.1.7. Приклад створення узагальненої функції abs() 371
17.2. Узагальнені класи 371
17.2.1. Створення класу з одним узагальненим типом даних 372
17.2.2. Створення класу з двома узагальненими типами даних 374
17.2.3. Створення узагальненого класу для організації безпечного масиву 375
17.2.4. Використання в узагальнених класах аргументів, що не є типами 376
17.2.5. Використання в шаблонних класах аргументів за замовчуванням 378
17.2.6. Безпосередньо задані спеціалізації класів 379
Розділ 18. Оброблення виняткових ситуацій 381
18.1. Основи оброблення виняткових ситуацій 381
18.1.1. Системні засоби оброблення винятків 381
18.1.3. Перехоплення винятків класового типу 386
18.1.4. Використання декількох catch-настанов 387
18.2. Варіанти оброблення винятків 388
18.2.1. Перехоплення всіх винятків 388
18.2.2. Обмеження, що накладаються на тип винятків, які генеруються функціями 390
18.2.3. Повторне генерування винятку 392
18.3. Оброблення винятків, згенерованих оператором new 392
18.4. Перевантаження операторів new і delete 394
Розділ 19. С++-система введення-виведення потокової інформації 399
19.1. Порівняння C- та С++-систем введення-виведення 399
19.2. Потоки у мові програмування C++ 399
19.2.1. Файлові С++-потоки 400
19.2.2. Вбудовані С++-потоки 400
19.2.3. Класи потоків 401
19.3. Перевантаження операторів введення-виведення даних 402
19.3.1. Створення перевантажених операторів виведення даних 402
19.3.2. Використання функцій-"друзів" класу для перевантаження операторів виведення даних 404
19.3.3. Створення перевантажених операторів введення даних 405
19.3.4. Порівняння С- і С++-систем введення-виведення 407
19.4. Форматоване введення-виведення даних 408
19.4.1. Форматування даних з використанням функцій-членів класу ios 408
19.4.2. Встановлення ширини поля, точності та символів заповнення 411
19.4.3. Використання маніпуляторів введення-виведення даних 412
19.4.4. Створення власних маніпуляторних функцій 414
19.5. Файлове введення-виведення даних 416
19.5.1. Відкриття та закриття файлу 416
19.5.2. Зчитування і запис текстових файлів 418
19.5.3. Неформатоване введення-виведення даних у двійковому режимі 419
19.5.4. Зчитування і запис у файл блоків даних 421
19.5.5. Виявлення кінця файлу 422
19.5.6. Приклад порівняння файлів 423
19.5.7. Використання інших функцій для двійкового введення-виведення 424
19.5.8. Перевірка статусу введення-виведення 426
19.6. Використання файлів довільного доступу 427
19.6.1. Функції довільного доступу 427
19.6.2. Приклади використання довільного доступу до вмісту файлу 428
19.7. Використання перевантажених операторів введення-виведення даних під час роботи з файлами 430
Розділ 20. Динамічна ідентифікація типів і оператори приведення типу 432
20.1. Динамічна ідентифікація типів (RTTI) 432
20.1.1. Отримання типу об'єкта у процесі виконання програми 432
20.1.2. Приклад RTTI-застосування 436
20.1.3. Застосування оператора typeid до шаблонних класів 437
20.2. Оператори приведення типів 440
20.2.1. Оператор приведення поліморфних типів dynamic_cast 440
20.2.2. Оператор перевизначення модифікаторів const_cast 445
20.2.3. Оператор неполіморфного приведення типів static_cast 446
20.2.4. Оператор перетворення типу reinterpret_cast 446
20.2.5. Порівняння звичайної операції приведення типів з новими чотирма cast-операторами 447
Розділ 21. Поняття про простори імен та інші ефективні програмні засоби 448
21.1. Простори імен 448
21.1.1. Поняття про простори імен 448
21.1.2. Застосування настанови using 451
21.1.3. Неіменовані простори імен 453
21.1.4. Застосування простіру імен std 454
21.2. Застосування покажчиків на функції 455
21.2.1. Передача покажчиком на функцію її адреси іншій функції 457
21.2.2. Пошук адреси перевантаженої функції 458
21.3. Поняття про статичні члени-даних класу 460
21.5. Застосування до функцій-членів класу модифікаторів const і mutable 461
21.6. Використання explicit-конструкторів 463
21.7. Синтаксис ініціалізації членів-даних класу 465
21.8. Використання ключового слова asm 467
21.9. Специфікатор компонування функцій 468
21.10. Оператори вказання на члени класу ".*" і "->" 469
21.11. Створення функцій перетворення 471
Розділ 22. Введення в стандартну бібліотеку шаблонів 473
22.1. Огляд стандартної бібліотеки шаблонів 473
22.2. Поняття про контейнерні класи 476
22.3. Робота з векторами 477
22.3.1. Доступ до вектора за допомогою ітератора 480
22.3.2. Вставлення та видалення елементів з вектора 481
22.3.3. Збереження у векторі об'єктів класу 482
22.3.4. Доцільність використання ітераторів 484
22.4. Робота зі списками 485
22.4.1. Використання базових операцій для роботи зі списком 486
22.4.2. Сортування списку 489
22.4.3. Об'єднання одного списку з іншим 490
22.4.4. Зберігання у списку об'єктів класу 491
22.5. Поняття про відображення 493
22.5.1. Робота з відображеннями 494
22.5.2. Зберігання у відображенні об'єктів класу 496
22.6. Алгоритми оброблення контейнерних даних 498
22.6.1. Підрахунок кількості елементів 500
22.6.2. Видалення і заміна елементів 501
22.6.3. Реверсування послідовності 502
22.6.4. Перетворення послідовності 503
22.6.5. Дослідження алгоритмів 504
22.7. Використання класу string 504
22.7.1. Огляд функцій-членів класу string 508
22.7.2. Зберігання рядків у інших контейнерах 511
Розділ 23. Особливості роботи препроцесора С++ 513
23.1. Поняття про директиви препроцесора C++ 513
23.1.1. Директива #define 513
23.1.2. Директива #error 516
23.1.3. Директива #include 516
23.2. Директиви умовного компілювання 517
23.2.1. Директиви #if, #else, #elif і #endif 517
23.2.2. Директиви #ifdef і #ifndef 519
23.2.3. Директива #undef 520
23.2.4. Використання оператора defined 520
23.2.5. Про значення препроцесора 520
23.2.6. Директива #line 521
23.2.7. Директива #pragma 521
23.3. Оператори препроцесора "#" і "##" 522
23.4. Зарезервовані макроімена 522
23.5. Деякі поради студентам 523
Розділ 24. Формалізація процесу розроблення об'єктно-орієнтованого програмного забезпечення| 524
24.1. Удосконалення процесу розроблення програмного забезпечення 524
24.1.1. Безпосередній процес розроблення ПЗ 524
24.1.2. Каскадний процес розроблення ПЗ 524
24.1.3. Використання ООП 525
24.1.4. Сучасні підходи до розроблення ПЗ 525
24.2. Моделювання варіантів використання 526
24.2.1. Поняття про діючі суб'єкти 526
24.2.2. Поняття про варіанти використання 527
24.2.3. Поняття про сценарії 527
24.2.4. Застосування діаграм варіантів використання 527
24.2.5. Описи варіантів використання 528
24.2.6. Перехід від варіантів використання до класів 528
24.3. Предметна область програмування 529
24.3.1. Рукописні форми 529
24.3.2. Прийняття допущень і спрощень 531
24.4. Програма landlord: етап удосконалення 531
24.4.1. Встановлення діючих суб'єктів 531
24.4.2. З'ясування варіантів використання 532
24.4.3. Опис варіантів використання 532
24.4.4. Передбачення додаткових сценаріїв 533
24.4.5. Використання діаграм дій UML 534
24.5. Перехід від варіантів використання до класів 535
24.5.1. Аналіз переліку іменників з опису варіантів використання 535
24.5.2. Уточнення переліку іменників 535
24.5.3. Визначення атрибутів 536
24.5.4. Перехід від дієслів до повідомлень 536
24.5.5. Побудова діаграм класів 537
24.5.6. Побудова діаграм послідовностей 538
24.6. Кроки написання коду програми 541
24.6.1. Написання заголовного файлу 541
24.6.2. Створення початкових *.срр файлів 545
24.6.3. Вимушені спрощення коду програми 553
24.6.4. Взаємодія користувача з програмою 554
24.6.5. Труднощі написання коду програми 555
24.7. Резюме 555
Додатки. Доповнення до С++ 557
Додаток А. Основи створення консольних програм у середовищі Borland C++ Builder 559
А.1. Основні правила роботи у середовищі C++ Builder 559
А.1.1. Підготовка панелей інструментів 559
А.1.2. Утримання на екрані вікна з результатами роботи програми 560
А.1.3. Створення нового консольного проекту 560
А.1.4. Надання імені консольному проекту та збереження його 561
А.1.5. Робота з наявними файлами консольних програм 561
А.2. Компілювання, зв'язування і запуск консольних програм на виконання 562
А.2.1. Запуск консольної програми в середовищі C++ Builder 562
А.2.2. Запуск програми в MS DOS 562
А.2.3. Заздалегідь скомпільовані заголовні файли 562
А.2.4. Закриття і відкриття консольних проектів 562
А.3. Додавання заголовного файлу до консольного проекту 562
А.3.1. Створення нового заголовного файлу 563
А.3.2. Редагування заголовного файлу 563
А.3.3. Визначення місцезнаходження заголовного файлу 563
А.4. Проекти з декількома початковими файлами 563
А.4.1. Створення додаткових початкових файлів 563
А.4.2. Додавання наявних початкових файлів 564
А.4.3. Застосування менеджера проектів 564
А.4.4. Програми з консольною графікою 564
А.5. Відлагодження коду програми 565
А.5.1. Покроковий прогін коду програми 565
А.5.2. Перегляд змінних коду програми 565
А.5.3. Покрокове трасування функцій 565
А.5.4. Точки зупинки 565
Додаток Б. Основи створення консольних програм у середовищі Microsoft Visual C++ 567
Б.1. Елементи вікна середовища MVC++ 567
Б.2. Робота з однофайловими консольними програмами 567
Б.2.1. Компонування наявного файлу 567
Б.2.2. Створення нового файлу 568
Б.2.3. Виправлення помилок 568
Б.2.4. Інформація про типи в процесі виконання (RTTI) 569
Б.3. Робота з багатофайловими консольними програмами 569
Б.3.1. Поняття про проекти і робочі області 569
Б.3.2. Робота над проектом 569
Б.3.3. Збереження, закриття і відкриття проектів 570
Б.3.4. Компілювання і компонування 570
Б.4. Програми з консольною графікою 571
Б.5. Відлагодження програм 571
Б.5.1. Покрокове трасування 571
Б.5.2. Перегляд значень змінних 572
Б.5.3. Покрокове трасування функцій 572
Б.5.4. Використання точок зупинки роботи програми 572
Додаток В. Дещо про С-систему введення-виведення 573
В.1. Використання потоків у С-системі введення-виведення 573
В.2. Функції консольного введення-виведення даних 574
В.2.1. Використання функції printf() 574
В.2.2. Використання функції scanf() 576
В.3. С-система оброблення файлів 579
В.3.1. Використання функції fopen() 580
В.3.2. Використання функції fputc() 581
В.3.3. Використання функції fgetc() 581
В.3.4. Використання функції feof() 582
В.3.5. Використання функції fclose() 582
В.3.6. Використання функцій fopen(), fgetc(), fputc() і fclose() 582
В.3.7. Використання функції ferror() і rewind() 583
В.3.8. Використання функції fread() і fwrite() 583
В.4. Виконання операцій введення-виведення даних з довільним доступом до файлів 585
В.4.1. Використання функції fseek() 585
В.4.2. Використання функції fprintf() і fscanf() 586
В.5. Видалення файлів 586
Додаток Г. Особливості використання застарілого С++-компілятора 587
Додаток Д. .NET-розширения для C++ 589
Д.1. Ключові слова .NET-середовища 589
Д.2. Розширення препроцесора 591
Література 593
Про автора
Ю
рій
Іванович ГРИЦЮК (5.05.62
р.) – кандидат технічних
наук, доцент кафедри обчислювальної
техніки і моделювання технологічних
процесів (ОТіМТП),
член-кореспондент Лісівничої Академії
Наук України, керівник редакційно-видавничого
відділу Національного лісотехнічного
університету України (НЛТУ
України, м. Львів),
заступник головного редактора збірника
науково-технічних праць "Науковий
вісник НЛТУ України".
У 1982 році закінчив Коломийський технікум механічної обробки деревини за спеціальністю "Лісопильно-деревообробне виробництво" з присвоєнням кваліфікації техніка-технолога лісопильно-деревообробного виробництва. У 1989 році закінчив технологічний факультет Львівського лісотехнічного інституту (ЛЛТІ) за спеціальністю "Технологія деревообробки" з присвоєнням кваліфікації інженера-технолога деревообробного виробництва.
З 1989 року – асистент, старший викладач (1994), доцент (1998) кафедри ОТіМТП Українського державного лісотехнічного університету (УкрДЛТУ, м. Львів). У 1992 році захистив у ЛЛТІ кандидатську дисертацію на тему: "Оптимізація розкрою ДСП на заготовки".
Основні напрями наукової діяльності: технологія деревообробки; обчислювальна техніка і програмування; моделювання та оптимізація процесів деревообробки; прикладна математика. Опублікував: три монографії "Регулярне розміщування прямокутних об'єктів вздовж смуг односторонньо обмеженої стрічки" (2002), "Оптимізація технологічного процесу розкрою плитних деревних матеріалів на меблеві заготовки" (2004) і "Моделювання карт і оптимізація плану розкрою плитних деревних матеріалів на меблеві заготовки" (2005); три навчальних посібники, серед яких "Обчислювальна техніка, алгоритмізація і програмування мовою Pascal" (1995); понад 80 наукових статей у вітчизняних і зарубіжних виданнях.
Передмова
Процес оволодіння навиками програмування мовою С++ має багато спільного з науково-дослідною діяльністю. Це, передусім, пов'язано з тим, що ця мова поєднує декілька технологій програмування – традиційну, тобто процедурне програмування (представлене мовою С), об'єктно-орієнтоване програмування (представлене таким поняттям як клас, який підвищує потужність мови С++ порівняно з мовою С) і узагальнене програмування (програмування за допомогою шаблонів мови С++). Мова С++ постійно перебуває в стані розвитку, позаяк відбувається її доповнення новими функціональними можливостями, однак на даний час, з прийняттям у 1998 р. стандарту ISO/ANSI С++, специфікація мови стабілізувалася. Сучасні компілятори підтримують більшість функцій, дозволених цим стандартом, і більшість програмістів мали час звикнути до цих функцій.
У цьому навчальному посібнику огляд основ програмування мовою С дається в поєднанні з представленням функціональних можливостей мови С++, що робить його самодостатнім. Це означає, що студент вчиться не тільки виконувати дії з новими компонентами мови С++, але й опановує її основу – мову С. Вивчення починається з тих елементів мови, які є спільними для С і С++. Окрім того, тут особливо акцентовано на тих поняттях мови, важливість яких стане очевидною в процесі подальшого вивчення матеріалу, а також на відмінностях між мовами С і С++. Після того, як студент твердо засвоїть основи програмування мовою С++, до неї додадуться надбудови у вигляді об'єктно-орієнтованого підходу до процесу програмування мовою С++. Таким чином, він зможе скласти цілісне уявлення про те, що таке об'єкти, класи, шаблони і як вони реалізуються стандартом мови С++. У процесі викладення матеріалу опис тих чи інших положень мови продемонстровано невеликими навчальними програмами-прикладами, які студенту нескладно скопіювати і самостійно випробувати на власному комп'ютері.
Матеріал цього навчального посібника значною мірою відповідає робочим навчальним програмам таких дисциплін як "Обчислювальна техніка і програмування", а також "Об'єктно-орієнтоване програмування", які викладаються у Національному лісотехнічному університеті України (м. Львів) для студентів, що вивчають комп'ютерні науки.
Ми (автор, рецензенти і літературний редактор) приклали багато зусиль, щоби зробити матеріал цього навчального посібника конкретним, простим для розуміння, засвоєння та, що найважливіше, цікавим. Наша мета полягала у тому, щоби внаслідок вивчення того чи іншого матеріалу студенти могли створювати свої власні навчальні програми і, водночас, знаходити в цьому як користь, так і задоволення.
Подяки
Автор вдячний усім тим, хто так чи інакше сприяв написанню цього навчального посібника. Особлива подяка завідувачу кафедри ОТіМТП НЛТУ України, професору Ярославу Івановичу СОКОЛОВСЬКОМУ за цінні вказівки і безпосередню підтримку.
Автор висловлює вдячність рецензентам професорові _._. ______, професорові _._. _______ і професорові _._. _________, а також літературному редактору В.В. ДУДКУ за цінні зауваження та уточнення, які сприяли значному покращенню рукопису.
Автор з вдячністю прийме будь-які конструктивні зауваження стосовно викладеного у посібнику матеріалу, які можна надсилати за адресою:
79057, м. Львів, НЛТУ України, вул. Генерала Чупринки, 103. Кафедра ОТ і МТП.
Тел./факс: 233‑96‑95; 237‑82‑55; 241‑96‑81. E-mail: nv@forest.lviv.ua
Вступ
Основне завдання цього навчального посібника – навчити студентів розробляти програми мовою C++ з використанням процедурного та об'єктно-орієнтованого підходів. Необхідно зазначити, що протягом декількох останніх років на ринку програмного забезпечення відбулися значні зміни, які є очевидними навіть для не професіонала. Тому ще одне завдання цього навчального посібника полягає в тому, щоб викласти основні концепції ООП мовою C++ у контексті розвитку сучасного програмного забезпечення.
Серед студентів часто побутує думка, згідно з якою мову програмування C++ важко вивчити. Насправді вона має багато спільного з такими мовами програмування як Pascal чи Visual Basic, за винятком декількох вдало реалізованих нових ідей. Забігаючи наперед, зазначимо, що ці ідеї є цікавими та захопливими, тому їх вивчення навряд чи виявиться для Вас нудним. Окрім того, про зміст цих ідеї необхідно мати уявлення хоча би тому, що вони є не тільки основою сучасних технологій програмування і створення програмних продуктів, але й становлять значну частину "культури програмування".
Будемо сподіватися на те, що цей навчальний посібник допоможе студентам розібратися як зі специфікою ООП мовою C++, так і у загальних концепціях створення програмних продуктів. Запропонований матеріал буде корисним як студентам, що вивчають програмування, так і професійним програмістам – не фахівцям з області ООП, а також усім тим, хто має інтерес до даної області знань.
Нові концепції створення програмних продуктів
Донедавна більшість професійних програмістів реалізовували свої програмні проекти з використанням технології структурного чи процедурного програмування. Із зростанням обсягів оброблюваної інформації, зростанням вимог користувачів до програмних продуктів значно зростали розміри кодів розроблюваних програм. Щоразу перед розробленням нового проекту програмістам ставало дедалі очевидніше, що такі підходи є невдалими. Проблема полягала, передусім, у непропорційному зростанні складності процесу створення самих кодів програм порівняно зі зростанням вимог до програмного продукту.
Мабуть, буде справедливим твердження про те, що досконалі та вишукані програми, без перебільшення, належать до найскладніших творінь людини. Проте, зважаючи на надмірну складність, такі програми нерідко містять помилки – добре, якщо не значні. Бо інколи серйозні помилки у програмному забезпеченні потенційно спричиняють матеріальні збитки (наприклад, помилки у бухгалтерських чи банківських розрахунках), а іноді і загрожують життю багатьох людей (наприклад, під час керування атомними реакторами, авіапольотами чи космічним кораблем).
Внаслідок довготривалої боротьби з проблемою складності процесу написання кодів програм були вироблені нові концепції створення програмних продуктів, а саме:
об'єктно-орієнтоване програмування (ООП|);
уніфікована мова моделювання (UML);
спеціалізовані засоби розроблення сучасного програмного забезпечення.
У декого може виникнути слушне запитання: чому об'єктно-орієнтований підхід до програмування став пріоритетним під час розроблення більшості сучасних програмних продуктів? Відповідь може бути такою: ООП пропонує новий потужний механізм вирішення проблеми процесу написання складних кодів програм. А саме: замість того, щоб розглядати програму як набір послідовно виконуваних настанов, у ООП код програми представляється у вигляді сукупності деяких об'єктів, що мають схожі властивості і набори відповідних дій, які можна з ними проводити. Можливо, все те, про що тут буде сказано, здаватиметься Вам спочатку незрозумілим. Але це тільки доти, доки Ви не почнете детально вивчати відповідні розділи ООП з цього навчального посібника. З поступовим засвоєнням відповідного матеріалу Ви не раз переконаєтеся в тому, що застосування об'єктно-орієнтованого підходу до процесу програмування робить коди програм більш зрозумілими, надійними і простими для удосконалення.
Уніфікована мова моделювання (UML) – це не що інше, як графічне подання алгоритму розв'язання задачі з застосуванням об'єктно-орієнтованого підходу. Згідно з визначенням, UML – це графічна мова, що містить безліч різних діаграм, які допомагають фахівцям з системного аналізу створювати алгоритми, а програмістам – з'ясовувати принципи роботи програми. UML є потужним інструментом, який дає змогу зробити процес програмування більш легким і ефективним. Кожен новий засіб реалізації основних елементів UML викладено у тому місці, де він стає корисним для ілюстрації основних концепцій ООП|. Наприклад, діаграми класів UML вивчаються одночасно з взаємодією різних класів, а узагальнення – у зв'язку з поняттям успадкування. Таким чином, у читача з'являється можливість, не докладаючи зайвих зусиль, засвоїти основні концепції мови UML, яка одночасно сприятиме більш ефективному засвоєнню ООП мовою C++.
Одним із спеціалізованих засобів розроблення сучасного програмного забезпечення є система візуального ООП під назвою С++ Builder 6 і попередні її версії. Система призначена для створення завершених додатків для Windiws найбільш різноманітної спрямованості, від суто обчислювальних і логічних – до графічних і мультимедійних. наголосимо, що у цьому посібнику, окрім вивчення процедурного та об'єктно-орієнтованого програмування мовою C++, зовсім не приділено уваги спеціалізованим засобам розроблення сучасного програмного забезпечення, оскільки цей матеріал належить до іншої дисципліни.
Сучасні об'єктно-орієнтовані мови програмування
Зі всіх об'єктно-орієнтованих мов програмування найчастіше використовується мова C++. Мова програмування C++ отримала набагато більшу популярність, ніж такі мови як Pascal, Visual Basic чи C, бо вона стала потужним інструментом для розроблення складного програмного забезпечення. У синтаксичному плані мови C і C++ дуже схожі між собою. Понад це, мова програмування C++ є надбудовою мови C. Завдяки цьому відпала потреба перед вивченням мови програмування C++ вивчати мову С. Ті студенти, які мають навики роботи мовою C, можуть знехтувати частиною матеріалу, викладеного на початкову цього посібника, проте решта інформації буде для них новою і корисною для засвоєння.
Окрім того, ООП мовою С+ містить декілька нових концепцій, які можуть бути незнайомі тим, хто практикує програмування такими традиційними мовами, як Pascal, Visual Basic і C. До цих концепцій належать класи, успадкування і поліморфізм, які становлять основу об'єктно-орієнтованого підходу до створення сучасних програмних продуктів. Проте, вивчаючи специфічні особливості об'єктно-орієнтованих мов, необізнаним програмістам досить легко піти манівцями від цих понять. Багато сучасних авторів разом з описом різних мов програмування вдаються до детального опису можливостей тієї чи іншої мови, не приділяючи зовсім уваги тому, чому ці можливості існують. У цьому навчальному посібнику нюанси ООП мовою С++ розглянуто у безпосередньому його зв'язку з базовими концепціями сучасних технологій програмування та створення програмних продуктів.
Мова програмування Java, що є останньою розробкою в області об'єктно-орієнтованих мов, позбавлена таких складових, як покажчики, шаблони і множинне успадкування, що зробило її менш могутньою і гнучкою порівняно з мовою C++. З огляду на те, що синтаксис мов Java і C++ дуже схожі, тому отримані студентами знання стосовно мови програмування C++ з успіхом можуть бути використані під час самостійного вивчення мови Java. Деякі інші об'єктно-орієнтовані мови, серед яких є і мова С#, також успішно розвиваються, проте їх розповсюдження значною мірою поступається мові C++.
Донедавна мова C++ розвивалася поза рамками відповідних стандартів, тобто кожен виробник компіляторів по-своєму реалізовував окремі нюанси мови. Проте комітет зі стандарту мови С++ організації ANSI/ISO1 розробив документ, який на сьогодні відомий під назвою "Стандарт C++". Згідно з цим документом, мова програмування C++ містить ряд уточнень і доповнень, які стосувалися раніше мов С і С++, а також багато додаткових можливостей, наприклад, стандартну бібліотеку шаблонів (бібліотека STL). Ця бібліотека надає програмісту доступ до шаблонних класів і функцій загального призначення, які реалізують багато популярних і часто використовуваних алгоритмів і структур даних. Наприклад, вона містить підтримку векторів, списків, черг і стеків, а також визначає різні функції, які забезпечують до них доступ.
Деякі засоби мови програмування C було замінено на аналоги з описом мови програмування C++. Наприклад, у мові C такі основні функції введення/виведення даних як printf() і scanf() у мові C++ практично не використовують, оскільки cin і cout є більш зручними для введення та виведення потокової інформації. З аналогічної причини замість макровизначення #define, типового для мови С, практично скрізь використовується специфікатор const і вбудовані функції C++. Тому у цьому посібнику опущено описи цих і деяких інших функцій.
Оскільки основну увагу в цьому навчальному посібнику сконцентровано на ООП мовою С++, то ми вилучили з детального розгляду ті засоби мови C, які рідко використовуються і не мають відношення до об'єктно-орієнтованого підходу. Прикладом одного з таких засобів є побітові операції мови C, які розглядаються тільки частково у роз. 10.4, і то тільки стосовно бітових полів структур.
Усі розглянуті у цьому навчальному посібнику коди програм повністю задовольняють вимогам стандарту мови програмування C++ за незначними винятками, які зумовлені некоректною роботою компіляторів. Окремий розділ присвячено бібліотека STL (стандартній бібліотеці шаблонів), що є частиною стандарту мови програмування C++.
Базові знання, необхідні студентам для вивчення цього навчального посібника
Матеріал, викладений у цьому навчальному посібнику, доступний навіть тим студентам, хто вивчає програмування "з нуля". Проте наявність досвіду програмування такими мовами, як Pascal чи Visual Basic, не стоятиме на заваді при засвоєнні матеріалу з цього посібника.
Багато підручників з описом мови програмування C++ розраховано на те, що студенти вже знайомі з мовою C. Наш навчальний посібник в цьому сенсі є винятком, позаяк вивчення мови програмування C++ починається "з чистого листа", і відсутність знань з мови C ніяк не позначиться на ефективності засвоєння ООП мовою C++. Студенти, знайомі з мовою C, напевно звернуть увагу на те, як мало існує відмінностей між мовами C і C++.
Бажано також, щоб студенти, вивчаючи матеріал з цього навчального посібника, мали уявлення про основні операції Microsoft Windows, такі, як запуск програм на виконання, копіювання файлів тощо.
Можливо, викладачам і іншим нашим читачам, які вже володіють мовою C++, буде цікаво детальніше ознайомитися з нашою концепцією висвітлення матеріалу, а також підходом, який ми пропонуємо під час вивчення ООП мовою C++.
Послідовність подання матеріалу
У цьому посібнику вивчення процесу програмування починається з найпростіших прикладів розроблених програм мовою С++, поступово ускладнених і закінчуючи повноцінними об'єктно-орієнтованими програмами. Інтенсивність подання нового матеріалу є такою, що у студента є можливість без зайвого поспіху його вивчити і, при потребі, повторити пройдений. Для полегшення процесу засвоєння нового матеріалу у кожному розділі цього посібника наведено достатню кількість наочних прикладів з програмною їх реалізацією, а також детальним аналізом їх програмних блоків. Окрім того, у кінці кожного розділу наведено контрольні запитання і вправи, що у сукупності дає змогу використовувати навчальний посібник як практичну допомогу зацікавленим студентам під час написання курсових чи дипломних робіт.
Кожен розділ цього посібника містить близько 15 вправ, що передбачають розроблення студентами завершених програм мовою C++. Розв'язання перших 3-4 вправ наведено у додатку Ж. Решта вправ розраховано на самостійне їх виконання. Хоча у посібнику і не наводяться розв'язки (коди програм) для тих вправ, які не помічені знаком *, проте їх, як і самі приклади запропонованих читацькій увазі кодів програм можна знайти на сайті видавництва за такою адресою:
http://www.nufwtulviv.com.ua
Вправи кожного розділу відрізняються між собою за ступенем складності. Перші за порядком вправи зазвичай є легкими, а ближче до кінця списку розташовуються найбільш складні вправи. Це створює зручність для викладачів, які отримають можливість забезпечувати своїх студентів індивідуальними завданнями, що відповідають рівню їх підготовки.
Технічне і програмне забезпечення
Найбільш популярним середовищем для розроблення програм мовою C++ є продукт, який був запропонований спільно компаніями Microsoft і Borland, призначений для роботи під управлінням операційних систем Microsoft Windows. Наведені у цьому навчальному посібнику приклади кодів програм розроблено так, що вони підтримуються як компіляторами Microsoft, так і компіляторами Borland (детальнішу інформацію про компілятори можна знайти у відповідних документаціях до "Microsoft Visual C++" і до "Borland C++ Builder". Інші компілятори, розраховані на стандарт мови програмування C++, безпомилково сприйматимуть більшість кодів програм у тому вигляді, у якому їх наведено у цьому навчальному посібнику.
Для того, щоб будь-який з компіляторів міг працювати на Вашому комп'ютері, Вам потрібно забезпечити достатній вільний дисковий простір, відповідний об'єм оперативної пам'яті та швидкодію процесора. Ці параметри можна дізнатися у настанові з експлуатації відповідних пристроїв.
Звернемо Вашу увагу на те, що у цьому навчальному посібнику містяться навчальні приклади програм, початкові коди яких є консольними, тобто такими, що виконуються в текстовому вікні компілятора або безпосередньо в управлінському вікні MS DOS. Це зроблено для того, щоб уникнути складнощів, які виникають під час роботи з повноцінними графічними додатками Windows.
Процес розроблення прикладного програмного забезпечення стає все більш і більш важливим аспектом технології програмування. Шкода, але часто процес створення об'єктно-орієнтованої програми залишається для студентів загадкою. Це послужило для нас приводом помістити у навчальний посібник спеціальний розділ, що стосується процесу розроблення сучасного програмного забезпечення, де основну увагу приділено реалізації концепції об'єктно-орієнтованому підходу (див. дод. А).
Орієнтовний порядок вивчення ООП|
У цьому посібнику початкові розділи (з 1-го по 10-ий) присвячено вивченню процедурно-орієнтованої концепції програмування, властивої мові C++. А вже після цього детально розглянуто концепцію ООП|. Таким чином, початковим нашим завданням є розгляд основ процедурного програмування мовою С++. Це стосується насамперед тих студентів, хто ще недостатньо володіє початковими навиками програмування мовою С++. Особливу увагу тут варто звернути на ті розділи, які стосуються застосування покажчиків, С++-функцій та засобів програмування для розширення їх можливостей, С++-специфікаторів і спеціальних операторів, а також структури та об'єднання даних.
Після цього ООП мовою С++ починається з безпосереднього вивчення механізму реалізації класів – фундаменту, на якому побудовано С++-підтримку ООП, а також ядро багатьох набагато складніших програмних засобів. Особливу увагу тут необхідно звернути на ті розділи, які стосуються роботи з класами, механізму перевантаження операторів, успадкування в класах, застосування віртуальних функцій та поліморфізму, шаблонів у класах, оброблення виняткових ситуацій, С++-системи введення-виведення потокової інформації тощо.
Деякі питання у цьому навчальному посібнику розглядаються дещо раніше, ніж це прийнято в іншій літературі з описом мови програмування C++: наприклад, розгляд структур передує розгляду класів. Причиною цього є те, що клас – це не що інше, як синтаксичне розширення структури, тому, як наслідок, структура є ключем до розуміння ООП мовою C++.
З самого початку висвітлення матеріалу у цьому навчальному посібнику використано С++-систему введення-виведення різних даних, але не дано докладних пояснень з механізму її реалізації. Оскільки С++-система введення-виведення побудовано на ієрархії класів, то її теорію і деталі реалізації неможливо засвоїти, не розглянувши спочатку механізм реалізації класів, успадкування в класах і оброблення виняткових ситуацій. На нашу думку, якраз після цього і настає момент для докладного вивчення С++-засобів введення-виведення потокової інформації.
Частина І. Основи програмування мовою С++
У цій частині навчального посібника будуть розглядатися такі основні теми:
Про автора 18
Передмова 19
Вступ 20
Розділ 1. Історія виникнення| мови програмування С++ 27
Розділ 2. Основні елементи мови програмування С++ 35
Розділ 3. Основні типи даних| у мові програмування C++ 55
Розділ 4. Поняття про настанови керування ходом виконання С++-програми 72
Розділ 5. Масиви та рядки – засоби групування взаємопов'язаних між собою змінних 91
Розділ 6. Особливості застосування покажчиків 111
Розділ 7. Основи застосування С++-функцій 131
Розділ 8. Використання засобів програмування для розширення можливостей С++-функцій 157
Розділ 9. С++-специфікатори та спеціальні оператори 177
Розділ 10. Поняття про структури і об'єднання даних 206
Розділ 11. Основи розроблення об'єктно-орієнтованих програм мовою C++ 233
Розділ 12. Введення в класи 245
Розділ 13. Робота з класами 270
Розділ 14. Перевантаження операторів 293
Розділ 15. Успадкування в класах 324
Розділ 16. Віртуальні функції та поліморфізм 349
Розділ 17. Шаблони в класах 364
Розділ 18. Оброблення виняткових ситуацій 381
Розділ 19. С++-система введення-виведення потокової інформації 399
Розділ 20. Динамічна ідентифікація типів і оператори приведення типу 432
Розділ 21. Поняття про простори імен та інші ефективні програмні засоби 448
Розділ 22. Введення в стандартну бібліотеку шаблонів 473
Розділ 23. Особливості роботи препроцесора С++ 513
Розділ 24. Формалізація процесу розроблення об'єктно-орієнтованого програмного забезпечення| 524
Додаток А. Основи створення консольних програм у середовищі Borland C++ Builder 559
Додаток Б. Основи створення консольних програм у середовищі Microsoft Visual C++ 567
Додаток В. Дещо про С-систему введення-виведення 573
Додаток Г. Особливості використання застарілого С++-компілятора 587
Додаток Д. .NET-розширения для C++ 589
Література 593
Розділ 1. Історія виникнення| мови програмування С++
Мова програмування С++ – єдина з найрозвиненіших мов, яку може засвоїти будь-який програміст. Ця заява може видатися дуже серйозною, але вона – не перебільшення. Мова програмування С++ – це центр притягання, навколо якого "обертається" все сучасне програмування. Її синтаксис і принципи розроблення визначають суть об'єктно-орієнтованого програмування. Понад це, мова C++ вторувала шлях для розроблення багатьох інших мов майбутнього. Наприклад, моти Java та С# – прямі "нащадки" мови C++. Мову C++ також можна назвати універсальною мовою програмування, оскільки вона дає змогу програмістам обмінюватися різноманітними ідеями. Сьогодні бути професійним програмістом високого класу означає бути компетентним у мові C++. Мова програмування С++ – це ключ до сучасного програмування.
Приступаючи до вивчення мови програмування C++, важливо знати, як вона вписується в історичний контекст мов програмування. Розуміючи, що привело до її створення, які принципи розроблення вона представляє і що вона успадкувала від своїх попередників, студентам буде легше оцінити суть новаторства і унікальність засобів мови програмування C++. Саме тому у цьому розділі студентам запропоновано зробити короткий екскурс в історію створення мови програмування C++, заглянути в її витоки, проаналізувати її взаємостосунки з безпосереднім попередником, тобто мовою програмування С, розглянути її можливості (області застосування) і принципи програмування, які вона підтримує. Тут також студент дізнаєтеся, яке місце займає мова C++ серед інших мов програмування.
1.1. Витоки мови програмування C++
Історія розроблення мови програмування C++ починається з мови С, тобто, тобто її побудовано на фундаменті С. Мова програмування C++ насправді є надбудовою мови С. Це означає, що всі компілятори C++ можна використовувати для компілювання С-програм. Мову C++ можна назвати розширеною і поліпшеною версією мови С, у якій реалізовані принципи об'єктно-орієнтованого програмування. Мова програмування C++ також містить ряд інших удосконалень мови С, наприклад розширений набір бібліотечних функцій. При цьому "смак і запах" мова C++ успадкувала безпосередньо з мови програмування С. Щоб до кінця зрозуміти і оцінити перевага мови програмування C++, необхідно зрозуміти все "як" і "чому" відносно мови С.
