Лабораторна робота № 7
Робота з класами в С++
1.Теоретичні відомості
1.1. Основні поняття об’єктно-орієнтованого програмування
Об'єкт - це абстрактна сутність, наділена характеристиками об'єктів навколишнього реального світу. Створення об'єктів і маніпулювання ними - це зовсім не привілей мови C++, а скоріше результат методології програмування, що втілює в кодових конструкціях опис об'єктів і операції над ними. Кожен об'єкт програми, як і будь-який реальний об'єкт, відрізняється власними атрибутами і характерною поведінкою. Об'єкти можна класифікувати по різних категоріях. Кожен клас займає визначене місце в ієрархії класів. Таким чином, будь-який клас визначає деяку категорію об'єктів, а всякий об'єкт є екземпляр деякого класу.
Об’єктно-орієнтоване програмування (ООП) — це методика, що концентрує основну увагу програміста на зв'язках між об'єктами, а не на деталях їхньої реалізації. Основні принципи ООП:
інкапсуляція;
спадкування;
поліморфізм;
створення класів і об'єктів)
Інкапсуляція є об'єднання в єдиному об'єкті даних і кодів, що оперують з цими даними. У термінології ООП дані називаються членами даних (data members) об'єкта, а коди - об'єктними методами або функціями-членами (methods, member functions).
Інкапсуляція дозволяє в максимальному ступені ізолювати об'єкт від зовнішнього оточення. Вона істотно підвищує надійність розроблюваних програм, тому що локалізовані в об'єкті функції обмінюються з програмою порівняно невеликими обсягами даних, причому кількість і тип цих даних звичайно ретельно контролюються. У результаті заміна або модифікація функцій і даних, інкапсульованих в об'єкт, як правило, не спричиняє негативних наслідків для програми в цілому (з метою підвищення захищеності програм в ООП майже не використовуються глобальні змінні).
Іншим достатньо важливим наслідком інкапсуляції є легкість обміну об'єктами, переносу їх з однієї програми в іншу.
Запозичена в природи ідея спадкування вирішує проблему модифікації поведінки об'єктів і додає ООП виняткову силу і гнучкість. Спадкування дозволяє, практично без обмежень, послідовно будувати і розширювати класи, створені розробниками. Починаючи з найпростіших класів, можна створювати похідні класи по зростаючій складності, що не тільки легкі в налагодженні, але і прості за внутрішньою структурою.
Послідовне проведення в життя принципу спадкування, особливо при розробці великих програмних проектів, добре погоджується з технікою спадного структурного програмування (від загального до частки), і багато в чому стимулює такий підхід. При цьому складність коду програми в цілому істотно скорочується. Похідний клас (нащадок) успадковує усі властивості, методи і події свого базового класу („батька”) і всіх його попередників в ієрархії класів.
При спадкуванні базовий клас обростає новими атрибутами й операціями. У похідному класі звичайно з'являються нові члени даних, властивості і методи. При роботі з об'єктами програміст звичайно підбирає найбільш підходящий клас для рішення конкретної задачі і створює одного або декількох нащадків від нього, що здобувають здатність робити не тільки те, що закладено в „батьку”. Дружні функції дозволяють похідному класові одержати доступ до всіх членів даних зовнішніх класів.
Крім того, похідний клас може перевантажувати (overload) наслідувані методи в тому випадку, коли їхня робота в базовому класі не пасує нащадкові. Використання перевантаження в ООП усіляко заохочується, хоча в прямому розумінні значення цього слова перевантажень звичайно уникають. Говорять, що метод перевантажений, якщо він асоціюється з більш ніж одною однойменною функцією.
Поліморфізм - це властивість родинних об'єктів (тобто об'єктів, класи яких є похідними від одного „батька”) поводитися по-різному в залежності від ситуації, що виникає в момент виконання програми. У рамках ООП програміст може впливати на поведінку об'єкта тільки побічно, змінюючи вхідні в нього методи і додаючи „нащадкам” відсутні в „батька” специфічні властивості.
Для зміни методу необхідно перевантажити його в „нащадку”, тобто оголосити в „нащадку” однойменний метод і реалізувати в ньому потрібні дії. У результаті в об'єкті-батьку й об'єкті-нащадку будуть діяти два однойменних методи, що мають різну кодову реалізацію і, отже, що додають об'єктам різне поведінку. Наприклад, в ієрархії родинних класів геометричних фігур (точка, пряма лінія, квадрат, прямокутник, окружність, еліпс і т.д.) кожен клас має метод Draw, що відповідає за належний відгук на подію з вимогою намалювати цю фігуру.
Завдяки поліморфізмові, „нащадки” можуть перевантажувати загальні методи «батька» для того, щоб реагувати специфічним образом на ту саму подію.
1.2.Класи в C++
Перед тим як працювати з класом, програма повинна його оголосити. Розглянемо синтаксис оголошення класу на прикладі класу circle:
class Circle {
public:
Circle () ;
void SetRadius(void) ;
void GetRadius(void) ;
~Circle () ;
private:
void CalculateArea(void);
int radius;
int color;
};
Ключове слово class показує компілятору, що все, що знаходиться у фігурних дужках ({}) належить оголошенню класу. (Не забувайте ставити крапку з комою наприкінці оголошення.) Оголошення класу містить оголошення елементів даних (наприклад, int radius) і прототипи функцій-елементів класу. В оголошенні класу circle містяться наступні елементи даних:
int radius;
int color;
Оголошення також містить п'ять прототипів функцій-елементів:
Circle();//конструктор
void SetRadius(void) ;
void GetRadius(void) ;
~Circle () ;//деструктор
void CalculateArea(void);
Прототипи функцій і оголошення елементів даних включаються в оголошенні класу в розділи public (відкритий) або private (закритий). Ключові слова public і private говорять компілятору про приступність елементів-функцій і даних. Наприклад, функція SetRadius() визначена в розділі public, і це означає, що будь-яка функція програми може викликати функцію SetRadius(). Функція CalculateArea() визначена в розділі private, і цю функцію можна викликати тільки в коді функцій-елементів класу Circle.
Аналогічно, оскільки елемент даних radius оголошений у розділі private, прямий доступ до нього (для установки або читання його значення) можливий тільки в коді функцій-елементів класу Circle. Якби ви оголосили елемент даних radius у розділі public, то будь-яка функція програми мала би доступ (для читання і присвоювання) до елемента даних radius.
Нижче в якості прикладу наводиться програма формування и виведення на екоан платіжної відомості:
Приклад:
#include <iostream>
#include <cstring>
using namespace std;
class employee {
char name[80]; // private by default
public:
void putname(char *n); // these are public
void getname(char *n);
private:
double wage; // now, private again
public:
void putwage(double w); // back to public
double getwage();
};
void employee::putname(char *n)
{
strcpy(name, n);
}
void employee::getname(char *n)
{
strcpy(n, name);
}
void employee::putwage(double w)
{
wage = w;
}
double employee::getwage()
{
return wage;
}
int main()
{
employee ted;
char name[80];
ted.putname("Ted Jones");
ted.putwage(75000);
ted.getname(name);
cout << name << " makes $";
cout << ted.getwage() << " per year.";
return 0;
}
2. Завдання до лабораторної роботи:
Оголосити клас трикутників, методи якого дозволяють вводити довжини сторін і обчислювати площу і периметр. Створити два об’єкти класу трикутників, і для одного обчислити площу, а для другого-периметр.