ТА_Методички / Lec_9
.pdf
Особливості мови об’єктно-орiєнтованого програмування С++
Лекція № 1
1. Основнi вiдмiнностi С++ вiд С
С++ - унiверсальна мова програмування, яка задумана так, щоб зробити програмування бiльш приємним для досвідченого програмiста. С++ була розроблена так, щоб дати можливiсть одному програмісту без надмiрних зусиль написати програми обсягом декілька тисяч стрiчок.
За базову мову для С++ була вибрана мова С, тому що:
•вона вiдносно низького рiвня;
•вiдповiдає бiльшостi задач системного програмування;
•вже створено значну кількість бiблiотечних функцiй i сервiсних програм, написаних на С;
•є тисячі програмiстiв, якi знають С.
2/38
До ключових слiв, визначених в С у мову С++ додано такі ключовi слова:
overload |
delete |
friend |
protected |
catch |
new |
inline |
public |
try |
this |
operator |
template |
throw |
class |
private |
virtual |
Основна рiзниця мiж цими мовами полягає у методi побудови програм: мова С - модульна мова i внаслiдок цього парадигма програмування звучить так
“Визначте, якi модулi вам потрiбно; розчленiть програму так, щоб данi були захованi в модулях”;
мова С++ - об’єктно-орiєнтована мова i внаслiдок цього парадигма програмування звучить так
“Визначте, якi класи вам потрiбно; пiдготуйте повний набiр операцiй для кожного класу”.
3/38
Об’єктно-орiєнтоване програмування (ООП) включає в собi найкраще з структурного програмування i, використовуючи новi концепцiї дозволяє програмiсту набагато простiше розбити задачу на пiдзадачi, якi пiддаються керуванню.
Цi концепцiї називаються: об’єкти, полiморфiзм, успадкування. Розглянемо їх детальніше.
Об’єкти
Об’єкт - це логiчна одиниця, яка мiстить данi i код, що манiпулює цими даними. Всерединi об’єкту, код i/або данi можуть належати тільки даному об’єкту i недосяжнi будь-де за межами об’єкту. Таким чином об’єкт забезпечує певний рiвень захищеностi вiд iншої частини програми, що може випадково змiнити або некоректно використати цi данi.
Об’єкт - це змiнна визначена самим користувачем. Коли ви визначаєте об’єкт ви неявно створюєте новий тип даних.
4/38
Інкапсуляція
Інкапсуляція (incapsulation) – це механізм, який зв’язує воєдино код і дані, якими він управляє, а також забезпечує їхній захист від зовнішнього або неправильного використання. Всередині об’єкту код (функція) і дані можуть бути закритими (private) або відкритими (public). До закритої частини коду або даних не можна доступитись зовні, відкриті код або дані доступні з довільної частини програми. Як правило, відкрита частина коду забезпечує керовану взаємодію (інтерфейс) із закритими елементами об’єкта.
Полiморфiзм
ООП пiдтримує полiморфiзм який означає що одне iм’я може бути використане для декiлькох зв’язаних, але дещо рiзних застосувань. Наприклад, ви можете мати програму, що визначає три рiзних типи стека. Один стек застосовується для типу integer, iнший для float, а наступний - для long. Завдяки полiморфiзму ви створюєте функцiї роботи з елементами стеку, наприклад, push(), pop(), а компiлятор сам вибере потрiбну функцiю в залежностi вiд типу виклику.
Поліформізм дозволяє спростити програму, створюючи один інтерфейс для виконання різних дій. Відповідальність за вибір конкретної дії (методу) і ситуації, яка при цьому виникає, покладається на компілятор. Програмісту не обов’язково
5/38
вникати в цей процес. Необхідно лише пам’ятати відповідні правила, і коректно застосовувати загальний інтерфейс.
Успадкування
Успадкування (inheritance) – це процес, впродовж якого один об’єкт може набувати властивості іншого. Він займає авжливе місце в С++, оскільки підтримує концепцію класифікації (classification).
За допомогою успадкування програмiст може виразити iєрархiчну класифiкацiю. Наприклад принтер “Epson LX 1050” є частиною матричних принтерiв, якi в свою чергу є частиною класу принтерiв, який також є частиною ширшого класу оргтехнiка. Без використання класифiкацiї, кожний об’єкт повинен явно визначити всi свої характеристики. З використанням успадкування кожному об’єкту потрiбно визначити тi особливостi, якi властивi саме цьому класу.
Завдяки цим механiзмам акценти програмування в С++ змiщенi на проектування класiв, вiдносин мiж ними i лише потiм власне саме кодування. Це також зменшує кiлькiсть помилок, а отже i вартiсть програмного забезпечення, але водночас мова С++ не звiльняє програмiста вiд кодування i алгоритмiв.
6/38
Коротко про деякі технічні відмінності у мовах С++ і ANSI C:
♦Операція розширення області видимості (::)
В межах класу заміняє глобальні змінні та глобальні функції.
♦Посилання (&)
Розглянемо відому функцію swap(), яка служить для обміну значеннями між аргументами.
С-програма |
С++-програма |
void swap(int*a, int*b) |
void swap(int&a, int&b) |
{ |
{ |
int t; |
int t; |
t =*a; |
t=a; |
*a=*b; |
a=b; |
*b=t; |
b=t; |
} |
} |
Приклад наглядно ілюструє застосування операції посилання.
♦Бiблiотечнi функцiї malloc i free є стандартними С - функцiями, які використовують для видiлення i звiльнення пам’ятi. Робота з пам’ятю в С++ набагато гнучкiша. Два оператора new i delete забезпечують роботу з
7/38
пам’ятю. Вони автоматично викликаються при створеннi, знищеннi і копіюванні об’єкта без участi програмiста, при умові їх визначення.
♦Зникла необхiднiсть у препроцесорi #define, його з успiхом замiняють inline пiдстановки, та const.
♦Довжина змінних в С може бути до 32 знаків, в С++ на довжину не має обмежень.
♦Приведення до явного типу в С++ у визначених типів може відбуватися
двояко. Наприклад:
(float) t; float (t);
В ANSI С оголошення функцiї funct(void) визначає, що виклик функцiї вiдбувається без аргументiв. Це допустимо для С++, але ключове слово void можна опустити без втрати змiсту виклику.
♦В С++ при оголошенннi функцiй написаних на мовi С, додається надпис extern “C”.
8/38
Наприклад
extern “C” puts(const char* s); main()
{puts(“hello, world”); }
♦В С++ на відміну від С існує виклик функцій по замовчуванню:
Наприклад: |
int funct(double t = 5.7); виклик може відбувається |
||
таким чином: |
|
// виклик функції з аргументом t = 5.7; |
|
int a = funct(); |
|||
int a = funct(7.8); |
// виклик функції з аргументом t = 7.8. |
||
♦ Змінні в С++ можуть оголошуватись будь-де в програмі |
|
||
Наприклад: |
for (int i = 0; i < 20; i++) { |
... } |
|
♦ Робота з потоками.
Мова С++ не забезпечує засоби для вводу/виводу. Цього їй і не потрібно: такі засоби легко і елегантно можна створити з допомогою самої мови.
9/38
Традиційно засоби вводу/виводу розроблялися для невеликого числа вбудованих типів даних.
Але, в програмах на С++ як правило використовуються багато типів даних, визначених користувачем і тому потрібно також обробляти ввід і вивід значень цих типів.
Очевидно, що засоби вводу/виводу повинні бути простими, зручними, надійними в керуванні, ефективними і гнучкими і до всього іншого повними.
С++ містить декілька визначених потоків, що автоматично відкриваються коли починається виконання С++ програми. Це стандартний ввід (cin), стандартний вивід (cout), вивід помилки (cerr).
10/38
