- •Об’єкто-орієнтоване
- •Методичні рекомендації та модульні завдання
- •§1. Об’єкт. Структура. Клас.
- •§2. Управління доступом до членів класу
- •§3. Перезавантаження функцій
- •§4. Шаблони функцій
- •§5. Конструктори
- •§6. Статичні члени класу
- •§7. Деструктори
- •§8. Перезавантаження операцій
- •§9. Друзі класу
- •§10. Бінарні й унарні операції
- •§11. Створення класів з підкласами. Агрегація
- •Файл реалізації “Stack.Cpp”
- •§12. Успадкування
- •§13. Ієрархія успадкування класів
- •Модуль 1 (20 балів)
- •Лабораторна робота №1 (6 балів)
- •Тема: Структури. Зовнішні функції і функції-члени структури.
- •Завдання
- •Варіанти завдань
- •Лабораторна робота №2 (6 балів) Тема: Перезавантаження операцій і функцій Завдання
- •Варіанти завдань
- •Лабораторна робота №3 (8 балів) Тема: Структури та класи Завдання
- •Варіанти завдань
- •Варіанти завдань
- •Визначити функції:
- •Визначити функції:
- •Визначити функції:
- •Визначити функції:
- •Визначити функції:
- •Варіанти завдань
- •Лабораторна робота №6 (8 балів) Тема: Абстрактні класи Завдання
- •Варіанти завдань
- •Модуль контроль (15 балів) Теоретичні питання
- •Теоретичні питання
- •Модуль контроль підсумковий (30 балів)
- •Тематика задач
- •Теоретичні питання
- •Розподіл балів і годин
- •Список літератури
- •Навчальне видання
- •Методичні рекомендації та модульні завдання
- •58012, Чернівці, вул. Коцюбинського, 2
§1. Об’єкт. Структура. Клас.
Об'єкт – це абстрактна сутність, наділена характеристиками об'єктів оточуючого нас реального світу. Створення об'єктів і маніпулювання ними – результат методології програмування, що втілюється в кодових конструкціях опису об'єктів і операції над ними. Кожен об'єкт програми, як і будь-який реальний об'єкт, відрізняється власними атрибутами і характерною поведінкою. Таким чином, будь-який клас визначає деяку категорію об'єктів, а будь-який об'єкт є екземпляром деякого класу.
Метою введення класів у С++ є надання програмісту можливості створення нових типів даних, які такі ж зручні, як і вбудовані типи. Отже, клас – це визначений користувачем тип. Кожен клас містить дані і набір функцій, що маніпулюють з цими даними. Подібно тому, як сутність вбудованого типу, такого як int називається змінною, сутність визначеного користувачем типу (тобто класу) називається об'єктом. Центром уваги в С++ є не функції, а об'єкти. Нові типи потрібні для визначення концепції, яку не можна виразити вбудованими типами.
Клас не має фізичної сутності, його найближчою аналогією є структура. Пам'ять виділяється тільки тоді, коли клас використовується для створення об'єкта. Цей процес також називається створенням екземпляра класу (class instance).
Будь-який об'єкт мови C++ має однакові атрибути і функціональність з іншими об'єктами того ж класу. За створення своїх класів і поведінку об'єктів цих класів повну відповідальність несе сам програміст. Працюючи в деякому середовищі, програміст одержує доступ до великих бібліотек стандартних класів (наприклад, до бібліотеки візуальних компонентів C++Builder).
Звичайно, об'єкт знаходиться в деякому унікальному стані, обумовленому поточними значеннями його атрибутів. Функціональність об'єктного класу визначається можливими операціями над екземпляром цього класу.
Визначення класу в мові C++ містить інкапсуляцію членів даних і методів, що оперують із членами даних і визначають поведінку об'єкта. У термінології ООП дані називаються членами даних (data members) об'єкта, а коди - об'єктними методами чи функціями-членами (methods, member functions). Інкапсуляція дозволяє ізолювати об'єкт від зовнішнього оточення. Вона істотно підвищує надійність розроблювальних програм, тому що локалізовані в об'єкті функції обмінюються з програмою порівняно невеликими порціями даних, причому кількість і тип цих даних ретельно контролюється. У результаті заміна чи модифікація функцій і даних, інкапсульованих в об'єкт, як правило, не спричиняє наслідків, що погано прослідковуються, для програми в цілому (із метою підвищення захищеності програм в ООП майже не використовуються глобальні змінні). Іншим наслідком інкапсуляції є легкість обміну об'єктами, переносу їх з однієї програми в іншу. Саме схований зв'язок методу з класом, що його включає, виділяє його з поняття простої функції. Під час виконання методу він має доступ до всіх даних свого класу, хоча і не вимагає явної специфікації імені цього класу. Це забезпечується передачею кожному, без винятку, методу схованого параметра – непостійного вказівника this на екземпляр класу. При будь-якому звертанні методу до членів даних класу, компілятор генерує спеціальний код, що використовує вказівник this.
Класи в С++ є природним продовженням структур struct у С. Перш, ніж розглядати специфіку розробки класів на С++, розглянемо структури і побудуємо визначений користувачем тип, заснований на структурі.
Приклад 1:
struct Date{ іnt d,m,y;};// структура Date із змінними d–день, m–місяць, //y–рік
//функція для ініціалізації змінної voіd іnіt (Date& date, іnt d, іnt m, іnt y){ //date значеннями d,m,y
date.d =d;
date.m =m;
date.y =y;
}
void add_year(Date& date, іnt n)//додавання n–років до змінної y { //структури date
date.y +=n;
}
void add_month(Date& date, іnt n) //додавання n–місяців до змінної m { //структури date
date.m +=n;
}
void add_day(Date& date, іnt n)// додавання n–днів до змінної d { //структури date
date.d +=n;
}
Тут немає явного зв'язку між типом даних і функціями. Такий зв'язок можна встановити, визначивши функції як члени структури:
Приклад 2:
struct Date{
іnt d,m,y;
voіd іnіt (іnt dd,іnt mm, іnt yy);
void add_year(іnt n);
void add_month(іnt n);
void add_day(іnt n);
};
voіd Date::іnіt(іnt dd,іnt mm,іnt yy)
{ d=dd;
m=mm;
y=yy;}
void Date::add_year(іnt n)
{
y +=n;
}
void Date::add_month(іnt n)
{
m +=n;
}
void Date::add_day(іnt n)
{
d +=n;
}
Оскільки різні структури можуть мати функції–члени з однаковими іменами, при визначені функції–члена треба вказати ім'я структури разом з оператором прив’язки – “::” (оператором дозволу області видимості):
voіd Date::іnіt(іnt dd,іnt mm,іnt yy) .
Якщо функції є членами структури, то об’єкт, для якого викликаються ці функції, вже не передається як параметр. Тому тіла цих функцій в прикладі 2 простіші, ніж в прикладі 1.
Функції, визначені всередині структури (класу), називаються функціями–членами і їх можна викликати тільки для змінної створеного типу, використовуючи стандартний синтаксис доступу до членів структури. Для доступу до елементів структури (чи класу) використовуються операція крапка (.) і операція стрілка (->). Операція крапка звертається до елемента структури (чи класу) по імені змінної чи об'єкта. Операція стрілка, що складається зі знака мінус (-) і знака більше (>), записаних без пробілу, забезпечує доступ до елементу структури (класу) через вказівник на об'єкт. Наведемо приклад основної програми з використанням створеної структури Date з прикладу 2.
Приклад 3:
#include <iostream.h>
#include <stdio.h>
Date my; // створення екземпляру структури Date з назвою my
void main() {
Date today; // створення екземпляру структури Date з назвою today
today.іnіt(1,1,1); //ініціалізація змінної today значеннями d,m,y
my.іnіt(1,2,1); //ініціалізація змінної my значеннями d,m,y
Date tomorrow=today; // створення екземпляру структури Date з //назвою tomorrow, яка ініціалізується даними
// змінної today
tomorrow.add_day (1);//додавання 1–го дня до tomorrow
cout << tomorrow.y; //друк року змінної tomorrow
}
У тілі функції–члена імена членів цього ж класу можна використовувати без явної вказівки об'єкта. Об’ява структури Date пропонує набір функцій для роботи з датою, але ніде не вказано, що тільки вони мають доступ до об’єктів класу Date. Обмежити доступ можна, використавши ключове слово class замість struct.