Об'єктно-орієнтоване програмування
ООП – вирішення кризи
Класи
Реалізація дій у ООП
Інкапсуляція
Пізніше зв'язування. Поліморфізм.
Ієрархія наслідування
Перевизначення методу
Повторне використання
OO програма
Принципи ООП
ООП в С++
Опис класу (без наслідування)
Специфікатори (модифікатори) доступу
Приклад класу
Використання об'єктів
Глобальні та локальні класи
Вбудовані та звичайні методи
Визначення методу поза класом
Приклади використання об'єктів
Вказівник this
Конструктори
Приклад використання конструктора
Список ініціалізації
Конструктор копіювання
Приклад використання конструктора копіювання
Об'єкти як параметри функцій
Об'єкти як результати функцій
Деструктори
Конструктори класів. Що таке Конструктор?
Навіщо потрібні конструктори.
Приклад роботи конструктора.
Приклад роботи конструктора під час створення об'єкта.
Конструктори класів. (Підсумки)
116.35K
Категория: ПрограммированиеПрограммирование

Об'єктно-орієнтоване програмування

1. Об'єктно-орієнтоване програмування

Об'єктно-орієнтоване програмування (ООП) – основна
методологія програмування.
Воно є продуктом 30-річної практики і включає низку
мов: Simula 67, Smalltalk, Eiffel, Objective C, C++, Object
Pascal, Java, C## .
Це стиль програмування, який фіксує поведінку
реального світу у такий спосіб, у якому деталі його
реалізації приховані.

2. ООП – вирішення кризи

ООП є лише останньою ланкою в довжиною ланцюга рішень, які були
запропоновані для вирішення "кризи програмного забезпечення".
Криза програмного забезпечення означає, що завдання, які ми
хочемо вирішити, випереджають наші можливості.

3. Класи

Класи – безліч однотипних об'єктів з однаковою поведінкою та
набором атрибутів.
У різних об'єктів одного класу різняться значення атрибутів, проте
методи збігаються.
Об'єкти називаються екземплярами класу.

4. Реалізація дій у ООП

Дія в ООП ініціюється шляхом передачі повідомлень об'єкту,
відповідальному за дії.
Повідомлення містить запит на здійснення дії та супроводжується
додатковою інформацією (аргументами), необхідною для її
виконання. Якщо об'єкт приймає повідомлення, на нього
автоматично покладається відповідальність за виконання
зазначеної дії.
Як реакцію повідомлення одержувач запускає деякий метод
(алгоритм), щоб задовольнити прийнятий запит. Деталі методу
відомі лише отримувачу повідомлення.

5. Інкапсуляція

Таким чином, внутрішній стан і поведінка об'єкта
приховано від інших об'єктів. Змінити його можна
ззовні лише за допомогою надсилання повідомлення
(дзвінка методу). У цьому полягає принцип
інкапсуляції .
Метод, який у відповідь повідомлення, визначається
класом, якому належить об'єкт. Усі екземпляри однієї
й тієї класу використовують однакові методи.

6. Пізніше зв'язування. Поліморфізм.

• Є певний об'єкт, який виконує метод
• Інтерпретація повідомлення (викликаний метод) залежить
від одержувача і для різних об'єктів може бути різною.
Зазвичай конкретний одержувач невідомий до виконання
програми, отже, невідомий метод, який буде викликаний. У
цьому випадку рішення, який метод викликати, має бути
ухвалено під час виконання програми. Такий спосіб зв'язку
повідомлення та методу називається пізнім зв'язуванням .
Можливість об'єктів по-різному реагувати на однакові
повідомлення називається поліморфізм .

7. Ієрархія наслідування

Класи можуть бути організовані в ієрархічну структуру з наслідуванням
властивостей. Дочірній клас (або підклас) успадковує атрибути
батьківського класу (або надкласу), розташованого вище в
ієрархічному дереві.
Об'єкт
Тварина
Ссавця
Техн. пристрій
Електронне устр.
Трансп. засіб
Монітор
Автомобіль
Людина
Студент

8. Перевизначення методу

Пошук методу, який викликається у відповідь певне повідомлення,
починається з методів, що належать класу одержувача.
Якщо відповідний метод не знайдено, пошук продовжується для
батьківського класу. Пошук просувається вгору ланцюжком
батьківських класів до того часу, доки знайдено потрібний метод чи
доки вичерпана послідовність батьківських класів.
У першому випадку виконується знайдений метод, у другому –
видається повідомлення про помилку.
Якщо вище в ієрархії класів існують методи з тим самим ім'ям, що й
поточний, то кажуть, що цей метод перевизначає поведінку, що
успадковується.
Можливість перевизначення методів є реалізацією поліморфізму.

9. Повторне використання

Спадкування дозволяє різним типам даних спільно
використовувати один і той же код, що призводить до
зменшення його розміру та підвищення
функціональності. Поліморфізм забезпечує, щоб
загальний код задовольняв конкретні особливості
окремих типів даних.
У результаті стає можливим максимально
використовувати код.

10. OO програма

Програма – сукупність взаємодіючих об'єктів. Кожен об'єкт виконує
певну функцію. Об'єкт з'єднує разом стан (дані) та поведінку
(методи). Об'єкти одного класу мають одні й самі методи.
Об'єкт виявляє свою поведінку шляхом виклику методу у відповідь
повідомлення. Інтерпретація повідомлення залежить від об'єкта і
може бути різною для різних класів об'єктів.
Для зручності створення нового класу з існуючих використовується
механізм успадкування. Спадкування забезпечує повторне
використання.

11. Принципи ООП

• Інкапсуляція (об'єднання даних із методами у
поєднанні зі прихованням даних)
• Абстракція (розширюваність системи класів)
• Спадкування (повторне використання методів та
атрибутів)
• Поліморфізм (перевизначення методів та гнучкий
вибір методу під час виконання програми)

12. ООП в С++

Клас – тип даних, що містить поля (змінні) та методи (функції) для їх
обробки.
Об'єкт – змінна типу клас.
Відмінності ООП в С++ від Delphi
• статичне розміщення об'єктів у пам'яті
• неявний виклик конструкторів та деструкторів
• перевантаження операцій
• множинне спадкування
• відсутність властивостей ( property)
• вкладеність класів
• відсутність єдиного предка

13. Опис класу (без наслідування)

class < ім'я > {
[private:]
< опис прихованих елементів >
public:
< опис доступних елементів >
};
Елементи класу – поля та методи.

14. Специфікатори (модифікатори) доступу

Модифікатор
успадкування
Модифікатор доступу
public
private
protected
publicуспадкування
public
private
protected
privateуспадкування
private
private
private
protectedуспадкування
protected
private
protected

15. Приклад класу

#include <iostream.h>
#include <string.h>
Поля
class student
{char fam [20], name [20];
Вбудовані методи
int age;
public:
void setdata (char * f, char * n, int a = 20)
{age = a; strcpy(fam, f);
strcpy(name, n);
}
void show ()
{ cout << fam << ' ' << name << ' ' << age <<
endl; }
};

16. Використання об'єктів

Опис об'єктів
int main()
{ student a, b;
a.setdata("Ivanov", "Boris");
b.setdata("Sokolova", "Olga", 19);
a.show();
Виклик методів
(передача повідомлень)
b.show();
return 0;
}

17. Глобальні та локальні класи

Класи можуть бути глобальними (оголошеними поза будь-яким
блоком) і локальними (оголошеними всередині блоку,
наприклад, функції або класу).
Локальні класи не можуть мати статичних елементів, всі методи
мають бути описані всередині класу.

18. Вбудовані та звичайні методи

Вбудований метод визначається усередині класу. Метод
може бути визначений поза класом, тоді всередині
класу вказується лише його заголовок.
class student
{char fam [20], name [20];
int age;
public:
void setdata (char * f, char * n, int a = 20 ) ;
void show () ;
};

19. Визначення методу поза класом

При визначенні методу поза класом у його заголовку вказується ім'я
класу з використанням операції доступу до області видимості ( ::).
void student :: setdata (char *f, char *n, int a)
{age = a; strcpy(fam, f);
strcpy(name, n);
}

20. Приклади використання об'єктів

student group [25];
student * s = new student;

for (int i = 0; i < 25; i++)
group[i].show();
s -> setdata ( "Sidorov", "Ivan");

21. Вказівник this

Для того, щоб метод працював з полями того об'єкта, для якого він
викликаний, передається прихований параметр , що містить
константний покажчик на об'єкт. У явному вигляді це
використовується для повернення посилання або покажчика на
об'єкт.
student& student :: old (student &a)
{ if ( age > a.age ) return *this;
return a;
}

student c = a.old(b);
c.show();

22. Конструктори

Конструктор – метод, призначений для ініціалізації об'єкта, що
виконується автоматично в момент його створення.
Конструктор має ім'я, що збігається з ім'ям класу.
Конструктор не повертає значення.
Клас може мати кілька перевантажених конструкторів із різними
параметрами.
Конструктор за замовчуванням не має параметрів. Для будьякого класу автоматично створюється такий конструктор.
Конструктор може мати параметри зі стандартними
значеннями.

23. Приклад використання конструктора

#include <iostream.h>
#include <iomanip.h>
Конструктор
#include <string.h>
class _time
{ int h,m;
public:
_time ( int hours = 0, int minutes = 0)
{ h = hours; m = minutes; }
void show()
{ cout << setfill('0')<< setw(2) << h
<< ':' << setw(2) << m << endl;}
};
int main()
{ _time t(12,30), p = 12;
t.show(); p.show(); return 0;}
Створення об'єктів із ініціалізацією

24. Список ініціалізації

Для ініціалізації полів у конструкторі. Список дозволяє ініціалізувати константні
поля та поля-посилання
class _time
{ int h,m;
public:
_time ( int hours = 0, int minutes = 0)
: h ( hours ), m ( minutes ) { }

};

25. Конструктор копіювання

Конструктор копіювання отримує як параметр
константне посилання на об'єкт того ж класу.
T (const T&)
Цей конструктор викликається
• при описі об'єкта з ініціалізацією іншим об'єктом
• при передачі об'єкта у функцію за значенням
• при поверненні об'єкта з функції
Якщо конструктор копіювання не вказано, його буде
створено автоматично.

26. Приклад використання конструктора копіювання

class student
{char * fam, * name;
int age;
public:
student (char * f, char * n, int a = 20): age (a)
{fam = new char [20]; name = new char [20];
strcpy (fam, f); strcpy (name, n); }
student (student &s) : age (s.age)
{fam = new char [20]; name = new char [20];
strcpy (fam, s.fam); strcpy (name, s. name); }
void show();
};
int main()
{ student a("Ivanov", "Boris"), b("Sokolova", "Olga", 19);
student c = a;
a.show(); b.show(); c.show(); return 0; }

27. Об'єкти як параметри функцій

Розглянемо метод складання часу class _time
{…
void add (const _time &time1,
const _time &time2)
{h = time1.h + time2.h;
m = time1.m + time2.m;
if (m > = 60) {h++; m-=60;}
h = h%24;}
};
Виклик: c.add(a, b);

28. Об'єкти як результати функцій

_time inc (_time interv)
{_time t;
th = h + interv.h;
tm=m+interv.m;
if (tm> = 60) {t.h++; tm-=60;}
th = th % 24;
return t;
}
Виклик: _ time c = a.inc(b);

29. Деструктори

~ < ім'я класу >
class student
{char * fam, * name;
int age;
public:

~student() { delete [] name; delete [] fam;}
};
int main()
{ student a("Ivanov", "Boris"), b("Sokolova", "Olga",
19);
student c = a;
a.show(); b.show(); c.show(); return 0; }

30. Конструктори класів. Що таке Конструктор?

• Конструктор - це унікальний метод , який називається так само як і
клас, в якому він створюється. АЛЕ конструктор не можна викликати
самостійно. Він викликається лише один раз, коли створюється
об'єкт. Наприклад:
public class MyClass {
p u b l i c M y C l a s s ( ) { // Це конструктор,
// який носить ім'я класу
} // У нього немає типу знач.
p u b l i c vo i d A n o t h e r M e t h o o d { // Це звичайний метод
// з будь-яким ім'ям
}
}

31. Навіщо потрібні конструктори.

• Щоб усвідомити навіщо потрібні конструктори, спочатку треба
зрозуміти ДЕ І ЯК вони викликаються.
Конструктор викликається лише за створенні об'єкта . Таким чином,
створивши кілька об'єктів одного класу, викличеться кілька
конструкторів, які будуть окремими для кожного об'єкта.
• Навіщо він так викликається? – Справа в тому, що конструктор
ініціалізує (Визначає) всі змінні даного об'єкта.
А ініціалізація – відбувається з кожною змінною лише один раз – у
момент створення.
• Без конструктора змінні ініціалізуються – нічим.
А конструктор виправляє це положення і надає значення

32. Приклад роботи конструктора.

• Конструктор приймає змінні того типу, який тип у змінних у класі
public class MyClass {
p u b l i c M y C l a s s ( i nt a , d o u b l e b , S t r i n g s s ) {
va r = a ;
va r 1 = b ;
st r = s s ;
}
i nt va r ;
d o u b l e va r 1 ;
S t r i n g st r ;
}

33. Приклад роботи конструктора під час створення об'єкта.

p u b l i c c l a s s p ro g 1 {
p u b l i c stat i c vo i d m a i n ( S t r i n g [ ] a rg s ) {
M y C l a s s o b j = N e w M y C l a s s ( 5 , 4 . 5 , " Ря до к " )
Syste m . o u t . p r i nt l n ( o b j .va r ) ; // Виведення числа 5
Syste m . o u t . p r i nt l n ( o b j .va r 1 ) ; // Виведення числа 4.5
Syste m . o u t . p r i nt l n ( o b j . st r ) ; // Виведення рядка «Рядок»
}
}

34. Конструктори класів. (Підсумки)

1. Конструктор – унікальний метод класу.
2. Конструктор називається також як клас.
3. У конструктора немає типу значення, що повертається . Тільки "
public "
4. конструктор не можна викликати самостійно
5. Конструктор викликається ТІЛЬКИ під час створення об'єкта.
6. Конструктор створюється для ініціалізації змінних
окремого об'єкту
7. Без конструктора змінні ініціалізуються – нічим.
А конструктор виправляє це положення і надає значення
8. Конструктор приймає змінні того типу, який тип у змінних у класі
English     Русский Правила