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

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-ma­il: nv@fo­rest.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++, необхідно зрозуміти все "як" і "чому" відносно мови С.