Слайд 2Мета введення класів в С++
Головна мета введення концепції класів в С++ — це
![Мета введення класів в С++ Головна мета введення концепції класів в С++](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-1.jpg)
забезпечення програміста засобами для створення нових типів, які були б такими ж зручними у використанні, як і вбудовані.
Тип — конкретний представник деякої концепції.
Клас — це тип, що визначає користувач. Для визначення концепції, яка не виражається безпосередньо вбудованими типами, створюються нові типи. Ретельно підібраний набір типів, які визначає користувач, робить програму коротшою і виразнішою.
Основний сенс введення нових типів полягає в обмеженні доступу до даних ззовні та у використанні для цього спеціальних процедур у межах чітко визначеного інтерфейсу.
Слайд 3Функції-члени
Функції, визначені всередині опису класу (до речі, структура — це один з
![Функції-члени Функції, визначені всередині опису класу (до речі, структура — це один](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-2.jpg)
видів класу), називаються функціями-членами, і їх можна викликати тільки для змінної відповідного типу, використовуючи стандартний синтаксис доступу до членів структури.
Оскільки різні структури можуть мати функції-члени з однаковими назвами, то, визначаючи функцію-член треба вказати ім’я структури:
Слайд 4Приклад
class complex_c1 {
public://need to know style- our preference
void assign(double r,
![Приклад class complex_c1 { public://need to know style- our preference void assign(double](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-3.jpg)
double i);
void print()
{ cout << real << " + " << imag << "i ";}
private:
double real, imag;
};
inline void complex_c1::assign(double r, double i = 0.0)
{
real = r;
imag = i;
}
Слайд 5Контроль доступу
Розглянемо приклад:
class X
{
public:
void init();
int getITnow();
private:
int x,y,z;
![Контроль доступу Розглянемо приклад: class X { public: void init(); int getITnow();](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-4.jpg)
int px,py,pz;
};
Слайд 6Контроль доступу
Імена в закритій private частині можна використовувати тільки у функціях-членах класу.
![Контроль доступу Імена в закритій private частині можна використовувати тільки у функціях-членах](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-5.jpg)
Відкрита public частина утворює відкритий інтерфейс об’єктів класу. (Структура — клас, члени якого відкриті за замовчуванням). Крім того, існує мітка protected (захищений), тобто всі змінні будуть доступні тільки прямим нащадкам цього класу.
Захист закритих даних базується на обмеженні використання імен членів класу. Цей захист можна обійти, маніпулюючи з адресами і явним перетворенням типу. Захист проти зловмисного доступу до закритих даних мовою високого рівня можна забезпечити тільки на апаратному рівні, хоча навіть це — досить складне завдання в реальній системі.
Слайд 7Статичні члени
Змінну, яка є частиною класу, а не частиною об’єкта цього класу,
![Статичні члени Змінну, яка є частиною класу, а не частиною об’єкта цього](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-6.jpg)
називають статичним членом і позначають специфікатором static
Слайд 8Приклад
#include
using namespace std;
class Conscription {
static int Age;
public:
void setInt(int n) {
Age = n;
}
int getInt() {
return Age;
}
};
int main()
{
Conscription Petrov, Sidorov;
Petrov.setInt(18);
cout << “Petrov’s age: " << Petrov.getInt() << '\n'; // displays 18
cout << “Sidorov’s age: " << Sidorov.getInt()<<'\n';// also displays 18
return 0;
}
![Приклад #include using namespace std; class Conscription { static int Age; public:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-7.jpg)
Слайд 9Константні функції-члени
Нехай у класі Х існують функції, які надають і змінюють значення
![Константні функції-члени Нехай у класі Х існують функції, які надають і змінюють](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-8.jpg)
об’єкта типу Х. Але, на жаль, не існує способу для перевірки значення об’єкта Х. Проте цю проблему можна легко вирішити, описавши ці функції як константні функції-члени, тобто функції, які не змінюють стан Х:
Слайд 10Приклад: три способи використання const
class Birthday {
int d,m,y;
const string congratulations;
public:
![Приклад: три способи використання const class Birthday { int d,m,y; const string](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-9.jpg)
int day() const {return d;}
int month() const {return m;}
int year() const {return y;}
const string getCon() { return congratulations; }
void print (const int d, const int m, const int y)
{cout<<“My birthday is ”<< d<<“.”< //…
};
Слайд 11Константні функції-члени
Коли константна функція-член описується зовні, а не всередині класу, то потрібно
![Константні функції-члени Коли константна функція-член описується зовні, а не всередині класу, то](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-10.jpg)
додати суфікс const:
inline int Date::year() const //правильно
{ return y;}
Константну функцію-член можна викликати як для константного, так і для неконстантного об’єкта, тоді як неконстантну функцію-член можна викликати тільки для об’єкта, який не є константою
Слайд 12Підкласи
Підкласи — це класи, які успадковують усі "властивості" суперкласу ("батьківського класу")
Геометрична
![Підкласи Підкласи — це класи, які успадковують усі "властивості" суперкласу ("батьківського класу")](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-11.jpg)
фігура
Коло
Прямокутник
Трикутник
Слайд 13Віртуальні функції
Віртуальні функції визначаються специфікатором virtual і дозволяють програмісту описати в базовому
![Віртуальні функції Віртуальні функції визначаються специфікатором virtual і дозволяють програмісту описати в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-12.jpg)
класі функції, які можна було б замінити у кожному наступному класі.
Слайд 14Ієрархія класів
Об’єкти різних класів і самі класи можуть перебувати у відношенні успадкування,
![Ієрархія класів Об’єкти різних класів і самі класи можуть перебувати у відношенні](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-13.jpg)
за якого формується ієрархія об’єктів, що відповідає заздалегідь передбаченій ієрархії класів.
Ієрархія класів дозволяє визначати нові класи на основі вже існуючих. Існуючі класи зазвичай називають базовими (інколи батьківським), а нові класи, що формуються на основі базових, — похідними (породженими), інколи класами-нащадками або спадкоємцями. Похідні класи “отримують спадок” — дані і методи своїх базових класів — і, крім того, можуть поповнюватись власними компонентами (даними і власними методами).
Наприклад, за таким визначенням
class S: X{…};
клас S породжений класом X, звідки він успадковує компоненти.
Слайд 15Приклад виконання
#include
#include
#include
using namespace std;
class Student
{
private:
string name;
![Приклад виконання #include #include #include using namespace std; class Student { private:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-14.jpg)
int age, course;
public:
void setData();
void getData();
};
Слайд 16Приклад виконання
void Student::setData()
{
cout<<"Enter name"<< endl;
cin>>name;
}
void Student::getData()
{
cout<< " Name=" <
![Приклад виконання void Student::setData() { cout cin>>name; } void Student::getData() { cout cout }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-15.jpg)
Слайд 17Приклад виконання
//-------------------------------------------------
int main()
{
Student Olga; //створення об’єкта
Student* Nick; //створення вказівника
Olga.setData();
![Приклад виконання //------------------------------------------------- int main() { Student Olga; //створення об’єкта Student* Nick;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-16.jpg)
//виклик функції setData() об’єкта Olga
Olga.getData();
Nick=new Student; //виділення пам’яті під об’єкт
Nick->setData(); //виклик функції об’єкта *Nick
Nick->getData();
getch();
return 0;
}
Слайд 18Об'єкти
Об‘єкт завжди:
є чітко обмеженим
не обов‘язково є відчутним
Приклад: процес хімічного виробництва
Об‘єкт характеризується
![Об'єкти Об‘єкт завжди: є чітко обмеженим не обов‘язково є відчутним Приклад: процес](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-17.jpg)
станом, поведінкою та ідентичністю;
структура та поведінка схожих об‘єктів визначають їх загальний клас. Об`єкт - це екземпляр класу.
Приклад: автомат з напоями, ліфт.
Стан об‘єкту — перелік (зазвичай статичний) усіх властивостей цього об‘єкту та поточними (звичайно динамічними) значеннями кожного з цих властивостей.
Слайд 19Приклад
class PersonnelRecord
{
public:
char * employee Name () const; //всі об‘єкти можуть
![Приклад class PersonnelRecord { public: char * employee Name () const; //всі](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-18.jpg)
int employee Local Security Number () const;
//отримати дані
char * employee Department () const;
protected:
char name [100]; //лише підкласи
int Social Security Number; //можуть визначати
char department [10]; //значення
float Salary;
};
Слайд 20Поведінка об’єкту
Поведінка об‘єкту — це спосіб дії та реакції об‘єкту.
Поведінка висловлюється в термінах
![Поведінка об’єкту Поведінка об‘єкту — це спосіб дії та реакції об‘єкту. Поведінка](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-19.jpg)
стану об‘єкту та передачі повідомлень.
Поведінка — яка спостерігається і перевіряється зовні дії об‘єкту.
Приклад: Автомат — в залежності від стану (кількості монет) видає або ні напій.
Слайд 21Приклад
Розглянемо клас «Черга»
class Queue
{
public:
Queue ();
Queue (const Queue
![Приклад Розглянемо клас «Черга» class Queue { public: Queue (); Queue (const](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-20.jpg)
&);
virtual ~Queue (); //знищує чергу, але не її учасників
virtual Queue & Operator = (const Queue &)
//virtual - буде визначатися
// в класах-нащадках
virtual int operator = = (const Queue &) const;
int operator! = (const Queue &) const;
virtual void clear ();
virtual void append (const void *);
virtual void pop (); //просування черги
virtual void remove (int at); virtual int length ();
virtual int isEmpty () const;
virtual const void * front () const;
virtual int location (const void *)const;
protected:
};
Слайд 22Mutable
mutable — антипод const, визначає член, який не буде const ні за
![Mutable mutable — антипод const, визначає член, який не буде const ні](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-21.jpg)
яких умов (навіть для const об‘єкта).
Слайд 23Відношення між класами
Класи не існують ізольовано.
Основні типи відносин між класами:
1. "узагальнення/спеціалізація" (загальне–частинне) “is
![Відношення між класами Класи не існують ізольовано. Основні типи відносин між класами:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-22.jpg)
a”
2. "ціле–частина" — “part of”
3. асоціація — семантичний, смисловий зв‘язок.
ОО мови програмування підтримують різні комбінації наступних типів відносин:
асоціація — найбільш загальне та невизначене відношення
успадкування — "загальне–частинне"
агрегація — "ціле–частина"
використання — наявність зв‘язку між екземплярами класів
інстанціонування — специфічний різновид узагальнення
метаклас — клас класів (класи як об‘єкти).
Слайд 24Приклад
Приклад
Студент КПІ - студент
Студент мед. Університету - студент
Студенти фіз-теху
![Приклад Приклад Студент КПІ - студент Студент мед. Університету - студент Студенти](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-23.jpg)
та ФІОТу - студенти КПІ
Відмінники - складові частини обох типів студентів
Викладачі - наводять жах на студентів.
Слайд 25Асоціація
Приклад — товари та продаж.
Class Product; //те, що продали
Class Sale; //угода, в якій
![Асоціація Приклад — товари та продаж. Class Product; //те, що продали Class](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-24.jpg)
продано
//декілька товарів
Class Product {
public:
. . .
protected:
Sale* last Sale;
};
Class Sale {
public:
. . .
protected:
Product** product Sold;
};
Слайд 26Асоціація
Асоціація — смисловий зв‘язок, як правило, не має напрямку та не пояснює, як
![Асоціація Асоціація — смисловий зв‘язок, як правило, не має напрямку та не](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-25.jpg)
класи спілкуються один з одним.
Потужність — кількість учасників цього смислового зв`язку
один до одного;
один до багатьох;
багато до багатьох.
Агрегація — включення одного класу до іншого — відповідає агрегації між екземплярами.
Агрегація як співвідношення "ціле–частина" є спрямованою. Не вимагає обов‘язкового фізичного включення (акціонер володіє акціями, але не складається з них).
Якщо (і тільки якщо) існує відношення "ціле–частина" між об‘єктами, класи повинні знаходитися у співвідношенні агрегації.
Використання — спрямовано, якщо клас є частиною сигнатури функції-члена іншого класу (параметром).
Використання класів –> рівноправний зв‘язок між їх екземплярами (клієнт–сервер).
Слайд 27Конструктори
Одне з основних завдань об’єктно-орієнтованого програмування полягає у тому, щоб об’єкти описаного
![Конструктори Одне з основних завдань об’єктно-орієнтованого програмування полягає у тому, щоб об’єкти](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-26.jpg)
раз і назавжди класу працювали «правильно» — тобто так, як це визначає модель. Кожний об’єкт перед тим як почати роботу, потрібно створити, тобто перевести в якийсь початковий стан. Отже, треба якимось чином описати можливі механізми створення об’єктів даного класу. Для цього в мові C++ існують конструктори. Це особливі методи класу, які й повинні перевести об’єкт у той самий початковий стан. Конструктор описується як метод, ім’я якого збігається з іменем класу, а тип поверненого значення опущений.
Слайд 28Приклад. Конструктор з параметрами для класу «Point»
class Point
{
public:
Point(int x0, int
![Приклад. Конструктор з параметрами для класу «Point» class Point { public: Point(int](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-27.jpg)
y0);
private:
int x, y;
};
Point::Point(int x0, int y0)
{
x=x0;
y=y0;
}
Тепер для створення об’єкта класу Point потрібно після імені змінної вказати параметри, як для виклику функції:
Point A(1, 1), B(2, 0);
Слайд 29Типи конструкторів
Існують деякі типи конструкторів, які, крім безпосереднього використання, автоматично викликаються у
![Типи конструкторів Існують деякі типи конструкторів, які, крім безпосереднього використання, автоматично викликаються](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-28.jpg)
деяких особливих ситуаціях.
Конструктор за замовчуванням
Конструктор за замовчуванням - це конструктор, що викликається без параметрів:
Point();
Point(int a=5);
Його використовують для створення масиву об’єктів, оскільки не зрозуміло, які конструктори і з якими параметрами треба викликати для кожного елементу масиву. Наприклад:
Point A[10];
Point* B=new Point[10];
Конструктор за замовчуванням викликається також тоді, якщо не вказано параметри для ініціалізації об’єкта, як у цьому випадку:
Point p;
Слайд 30Конструктор копіювання
Цей конструктор викликається тоді, коли потрібно створити копію об’єкта. Аргументом
![Конструктор копіювання Цей конструктор викликається тоді, коли потрібно створити копію об’єкта. Аргументом](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-29.jpg)
цього конструктора має бути посилання на об’єкт цього самого класу:
Point(Point& p);
Важливим випадком, коли викликається конструктор копіювання, є передавання об’єкта у функцію як параметра за значенням. Тоді створюється новий об’єкт і для нього автоматично викликається конструктор копіювання. Створення конструкторів копіювання потрібне у випадку, якщо об’єкт потребує якихось спеціальних операцій при копіюванні, оскільки під час стандартного копіювання вміст одного об’єкта просто побайтно переноситься в інший.
Слайд 31Приклад. Клас String з реалізованими конструкторами
class String
{
public:
String(); // конструктор за замовчуванням
![Приклад. Клас String з реалізованими конструкторами class String { public: String(); //](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-30.jpg)
String(const String& s); // конструктор копіювання
String(const char* s); // конструктор з параметром
// const char*, який являє собою
// стандартний рядок s
~String(); // деструктор
private:
char* array; // масив символів
int size; // розмір масиву
};
Слайд 32Приклад виклику конструкторів
int main()
{ String a, b; // конструктор за замовчуванням
String
![Приклад виклику конструкторів int main() { String a, b; // конструктор за](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-31.jpg)
c(a); // конструктор копіювання
print(a); // конструктор копіювання, оскільки
// аргумент передається у функцію за значенням
String d(“One”); // конструктор з параметром
//...
}
Слайд 33Деструктори
Конструктори ініціалізують об’єкт, тобто вони створюють середовище, у якому "працюють" функції-члени. Іноді
![Деструктори Конструктори ініціалізують об’єкт, тобто вони створюють середовище, у якому "працюють" функції-члени.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/377805/slide-32.jpg)
створення такого середовища зумовлює "захоплення" якихось ресурсів: пам’яті, файлу, процесорного часу, які повинні бути "звільнені" після їх використання. Тобто класам потрібна функція, яка б знищувала об’єкт аналогічно тому, як його створює конструктор. Такі функції називають деструкторами