Основні характеристики об'єктно — орієнтованого програмування
Конструктор може мати параметри, за допомогою яких при створенні об'єкта членам-даних (змінним класу) можна надати деякі початкові значення, які визначаються у основній функції main (). Це реалізується шляхом передачі аргументів конструктору об'єкта. У наведеному нижче коді програми спробуємо удосконалити клас myClass так, щоб він приймав аргументи, які слугуватимуть ідентифікаційними номерами (n… Читати ще >
Основні характеристики об'єктно — орієнтованого програмування (реферат, курсова, диплом, контрольна)
Об'єктно — орієнтоване програмування (ООП) — одна з парадигм програмування, яка розглядає програму як множину «об'єктів», що взаємодіють між собою. В ній використано декілька технологій від попередніх парадигм, зокрема успадкування, модульність, поліморфізм та інкапсуляцію. Незважаючи на те, що ця парадигма з’явилась ще в 1960;тих роках, вона не мала широкого застосування до 1990;тих. Сьогодні багато мов програмування (зокрема, Java, C#, C++, Objective-C, ActionScript 3) підтримують ООП. Об'єктно — орієнтований хід до розроблення програмних продуктів побудований на такому понятті як класи [2].
Клас визначає новий тип даних, який задає формат об'єкта. Клас містить як дані, так і коди програм, призначені для виконання дій над ними. Загалом, клас пов’язує дані з кодами програми, представляє собою набір об'єктів, що мають спільні характеристики. Клас також визначає інтерфейс із навколишнім світом, за допомогою якого здійснюється взаємодія з окремими об'єктами. Важливо розуміти, що клас — це логічна абстракція, яка реально не існує доти, доки не буде створено об'єкт цього класу, тобто це те, що стане фізичним представленням цього класу в пам’яті комп’ютера. Тому об'єкти — це примірники класового типу. Кожен об'єкт в цій моделі є незалежним, і він здатний отримувати, обробляти дані та відправляти ці дані іншим об'єктам. В ООП використано моделі успадкування, модульності, поліморфізму та інкапсуляції. Основним поняттям ООП є об'єкт. Об'єкт можна визначити як певну сукупність даних (характеристик об'єкта) та методів роботи з ними [2]. Кожен об'єкт має процедури і функції, які служать для роботи з даними об'єкта. Ці процедури і функції називаються методами. Визначаючи клас, оголошують ті глобальні дані, які міститимуть об'єкти, і програмні коди, які виконуватимуться над цими даними. Хоча інколи прості класи можуть містити тільки програмні коди або тільки дані, проте більшість реальних класів містять обидва компоненти. У класі дані оголошуються у вигляді змінних, а програмні коди оформляють у вигляді функцій. Змінні та функції називаються членами класу. Змінну, оголошену в класі, називають членом даних, а оголошену в класі функцію — функцією-членом класу. Іноді замість терміна член даних класу використовують термін змінна класу, а замість терміна функція-член класу використовують термін метод класу. Тому загальний формат оголошення класу має такий вигляд [3]:
class ім'я_класу.
{.
private:
закриті дані та функції класу.
public:
відкриті дані та функції класу.
}.
перелік_об'єктів_класy;
У цих оголошеннях елемент ім'я класу означає ім'я «класового» типу. Воно стає іменем нового типу, яке можна використовувати для побудови об'єктів цього класу. Визначивши клас, можна створити об'єкт цього «класового» типу, якщо використати ім'я класу. Отож, ім'я класу стає специфікатором нового типу. Наприклад, у процесі виконання наведеної нижче настанови створюється два об'єкти :
ObjA і ObjB типу myClass:
myClass ObjA, ObjB;
Після створення об'єктів класу кожен з них набуває власні копії членів-даних, які утворює клас. Це означає, що кожний з об'єктів ObjA і ObjB.
матиме власні копії змінної a. Отже, дані, пов’язані з об'єктом ObjA, відокремлені (ізольовані) від даних, які пов’язані з об'єктом ObjB. Щоб отримати доступ до відкритого члена класу через об'єкт цього класу, використовують оператор «крапка» (саме так це робиться і під час роботи із структурами). Наприклад, щоб вивести на екран значення змінної a, яка належить об'єкту ObjA, використовують таку настанову:
cout << «ObjA.a= «<< ObjA. a;
У оголошенні класу myClass містяться прототипи функцій-членів класу. Щоб реалізувати код функції, яка є членом класу, необхідно повідомити компілятор, до якого класу вона належить, кваліфікувавши ім'я цієї функції з іменем відповідного класу. Наприклад, ось як можна записати код функції.
Get ():
void myClass: Get (double x, double y).
{.
double a1 = pow (x, 1.3);
double a2 = pow (fabs (3.2*x — y), 0.4);
double a3 = pow (pow (cos (a2), 2), 1./3);
a = a1+a3;
}.
За своєю сутністю такий запис повідомляє компілятор про те, що дана версія функції Get () належить класу myClass [3]. Іншими словами, оператор дозволу «:» заявляє компілятору, що функція Get () знаходиться у області видимості класу myClass.
Існування ООП можливе завдяки трьом основним парадигмам на яких базується саме ООП:
Інкапсуляція — це механізм в програмуванні, який пов’язує в одне ціле функції і дані, якими вони маніпулюють, а також захищає їх від зовнішнього доступу і неправильного застосування. В об'єктно-орієнтованій мові функції.
і всі необхідні дані можуть пов’язуватись таким способом, що створюється автономна структура — об'єкт. Іншими словами, об'єктом є структура, яка підтримує інкапсуляцію. В межах об'єкта функції, дані або і функції і дані можуть бути або закритими для інших об'єктівprivate, або відкритимиpublic.
Успадкування — це властивість, з допомогою якої один об'єкт може набувати властивостей іншого. При цьому підтримується концепція ієрархічної класифікації. Без використання успадкування кожний об'єкт повинен явно визначати всі свої характеристики; використовуючи наслідування, об'єкт повинен визначати тільки ті якості, які роблять його унікальним в межах свого класу. Визначення нового класу може базуватись на визначенні вже існуючого. В такому випадку, новий клас отримає властивості та поведінку базового класу, та доповнить їх своїми власними. У випадку одиничного успадкування, у кожного класу може бути лише один безпосередній базовий клас. У випадку множинного успадкування, дозволяється існування декількох безпосередніх надкласів. Застосування методів успадкування дозволяє покращити повторне використання коду шляхом використання властивостей та методів базових класів.
Разом з інкапсуляцією і успадкуванням поліморфізм також являє собою одну із важливих концепцій ООП. Застосування цієї концепції дозволяє значно полегшити розробку складних програм. 5].
Термін поліморфізм має грецьке походження і означає «наявність багатьох форм». З поліморфізмом тісно пов’язані такі поняття, як абстрактні класи, віртуальні методи, перевантаження методів і властивостей.
Віртуальні методи — один із найважливіших прийомів реалізації поліморфізму. Вони дозволяють створювати загальний код, який може працювати разом з об'єктами базового класу, так і з об'єктами будь-якого його класу-нащадка. При цьому базовий клас визначає спосіб роботи з об'єктами і будь-які його нащадки можуть представляти конкретну реалізацію цього способу. Такі методи без реалізації називаються абстрактними.
Клас, який містить хоча б один такий метод називається абстрактним. Об'єкт такого класу створювати не можна. Нащадки абстрактного класу повинні обов’язково представити реалізацію для всіх його абстрактних методів, інакше, вони в свою чергу будуть абстрактними. Можливість присвоювати різну функціональність одному методу називається перевантаженням методу. 3].
Конструктор та деструктор
При створенні об'єктів однією з найбільш широко використовуваних операцій є ініціалізація елементів даних об'єкту.
Проте, щоб спростити процес ініціалізації елементів даних класу, в C++ є можливість використовувати так званий конструктор, який автоматично запускається для кожного створюваного об'єкту, ініціалізуючи його.
- · Конструктор є методом класу, який полегшує вашим програмам ініціалізацію елементів даних класу.
- · Конструктор має таке ж ім'я, як і клас.
- · Конструктор не має значення, що повертається.
- · Кожного разу, коли ваша програма створює змінну класу, C++ викликає конструктор класу, якщо конструктор існує.
Конструктор можна уявити як функцію, яка допомагає будувати (конструювати) об'єкт. Деструктор автоматично запускається кожного разу, коли програма знищує об'єкт. Щоб створити такі динамічні списки, ваша програма для зберігання об'єктів розподіляє пам’ять динамічно. Ви можете створювати і знищувати об'єкти в процесі виконання програми. В таких випадках має сенс застосування деструктора. 4].
При завершенні програм C++ знищував об'єкти. Якщо ви визначаєте деструктор усередині своєї програми, C++ буде автоматично викликати деструктор для кожного об'єкту, коли програма завершується (тобто коли об'єкти знищуються). Подібно конструктору, деструктор має таке ж ім'я, як і клас об'єкту. Проте у разі деструктора перед його ім'ям ставиться символ тильди (~), як показано: ~person (void).
Параметризовані конструктори.
Конструктор може мати параметри, за допомогою яких при створенні об'єкта членам-даних (змінним класу) можна надати деякі початкові значення, які визначаються у основній функції main(). Це реалізується шляхом передачі аргументів конструктору об'єкта. У наведеному нижче коді програми спробуємо удосконалити клас myClass так, щоб він приймав аргументи, які слугуватимуть ідентифікаційними номерами (n) черги. Передусім необхідно внести зміни у визначення класу myClass:
class myClass { // Оголошення класового типу.
double a;
int nom; // Містить ідентифікаційний номер об'єкта.
public:
myClass (int n); // Оголошення параметризованого конструктора.
myClass (); // Оголошення деструктора.
void Get (double, double); // Введення в об'єкт значення.
double Put (); // Виведення з об'єкта значення.
};
Член-даних nom використовують для зберігання ідентифікаційного номера об'єкта, який створюється основною функцією. Його реальне значення визначається значенням, яке передається конструктору як формальний параметр n при створенні змінної типу myClass. Параметризований конструктор myClass () буде мати такий вигляд:
// Визначення параметризованого конструктора.
myClass:myClass (int n).
{.
a = 0; nom = n;
cout << «Об'єкт «<< nom << «ініціалізовано» << endl;
}.
Загальний формат передачі аргументів конструктору: тип_класу ім'я_об'єкта (перелік_аргументів);
Конструктор копії.
Конструктор копії є спеціальним типом перевизначеного конструктора.
Основна причина використання конструктора копії полягає у тому, що при передачі об'єкта функції створюється побітова (тобто точна) його копія, яка передається параметру цієї функції.
Найпоширеніший формат конструктора копії об'єкта має такий вигляд:
ім'я_класу (const ім'я_класу &obj).
{.
//Тіло конструктора копії.
}.