Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_Посібник (1).doc
Скачиваний:
8
Добавлен:
01.05.2019
Размер:
544.77 Кб
Скачать

§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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]