You are on page 1of 38

Об’єктно-орієнтоване

програмування
Максим Михайлович Древаль
m.dreval@kpi.ua

Кафедра математичних методів системного аналізу (ММСА)


Інститут прикладного системного аналізу
НТУУ «КПІ ім. І.Сікорського»

Весняний семестр 2020/21


Старт курсу — 06 лютого 2021

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 1
У попередній серії…
Складність

складність предметної області складність реалізації

принцип абстрагування алгоритм теорія обчислювальної


складності

вимоги до алгоритму часова складність просторова складність

алгоритми алгоритми
… поліноміальної складності … експоненційної складності …

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 2
У попередній серії…
Процес розробки програмного забезпечення

етапи розробки моделі процесу розробки

аналіз вимог критерії вимог

проектування коректна класичні гнучкі


постановка задачі
програмування
тестування
каскадна
системна інтеграція Agile RAD V-Model

документація ітеративна Lean DSDM FDD

експлуатація спіральна Scrum RUP TDD


супровід Kanban XP BDD

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 3
У попередній серії…
Об’єктно-орієнтований підхід

клас об’єкт

класифікація
специфікатори функцій-членів
доступу

конструктори
public деструктор
інтерфейс класу за замовчуванням
protected селектори
з параметрами
private модифікатори
копіювання

поверхневе копіювання глибоке копіювання

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 4
Як написати
неперевершений код першої лабки?

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 5
Inline-функції

Inline-функція — це функція, для якої компілятор замість


ґенерування коду виклику виконує підстановку її тіла.

➢ Для оголошення inline-функції використовується ключове слово


(модифікатор) inline

➢ Оголошення inline-функції — запит, а не команда: у деяких випадках


компілятор його не виконуватиме. Наприклад, деякі компілятори не
виконують підстановку функцій, які містять цикли, switch, оператори
goto тощо

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 6
Inline-функції

inline int Area(int len, int hi) {


return len * hi;
}
int main() {
cout << Area(10,20);
}

➢ Функція, визначена всередині тіла класу, за замовчуванням є inline-


функцією

➢ Функція, визначена поза тілом класу, може стати inline-функцією шляхом


явного використання ключового слова inline

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 7
Inline-функції

class Student {
int rollNo;
public:
void setRollNo(int aRollNo){

rollNo = aRollNo;
}
};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 8
Inline-функції

class Student {

public:
inline void setRollNo(int aRollNo);
};
void Student::setRollNo(int aRollNo){

rollNo = aRollNo;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 9
Inline-функції

class Student {

public:
void setRollNo(int aRollNo);
};
inline void Student::setRollNo(int aRollNo) {

rollNo = aRollNo;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 10
Inline-функції

class Student {

public:
inline void setRollNo(int aRollNo);
};
inline void Student::setRollNo(int aRollNo) {

rollNo = aRollNo;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 11
Inline-функції

➢ Використання inline-функцій може значно підвищити ефективність роботи


програми.

➢ За «звичайного» виклику функції компілятором щоразу формується серія


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

➢ При використанні inline-функції немає необхідності в таких додаткових


діях, тому швидкість виконання програми зростає.

➢ Однак у тих випадках, коли розмір inline-функції достатньо великий, обсяг


коду програми також зростає. Тому inline-функціями зазвичай оголошують
дуже «маленькі» функції. «Великі» функції реалізуються звичайним
способом.

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 12
Вказівник this

class Student {
int rollNo;
char *name;
float GPA;
public:
int getRollNo();
void setRollNo(int aRollNo);

};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 13
Вказівник this

➢ Компілятор резервує пам’ять для функцій, визначених у класі

➢ Пам’ять для даних поки не резервується (оскільки жоден об’єкт цього


класу ще не створено)

Function Space
getRollNo(), …

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 14
Вказівник this

Student s1, s2, s3;

s2(rollNo,…)

Function Space
getRollNo(), … s3(rollNo,…)

s1(rollNo,…)

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 15
Вказівник this
➢ Пам’ять, виділена під функції, є спільною для кожної змінної типу
Student

➢ Щоразу, коли створюється новий об’єкт:


• пам'ять виділяється тільки для його змінних;
• раніше визначені функції використовуються знову і знову.

s1 s2 s3 s4
rollNo, … rollNo, … rollNo, … rollNo, …

Function Space
getRollNo(), …

➢ Як функції «знають», на який об’єкт діяти?

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 16
Вказівник this

➢ Адреса кожного об'єкта передається функції, яка його викликає

➢ Ця адреса дозволяє функціям діяти взаємодіяти з «правильним» об’єктом

s1 s2 s3 s4
rollNo, … rollNo, … rollNo, … rollNo, …
address address address address

➢ Змінна, яка містить «власну адресу» об’єкта — вказівник this

DataType * const this;

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 17
Вказівник this

➢ При кожному виклику функції класу вказівник this неявно передається їй


у якості параметра

➢ Функція з n параметрами насправді викликається з n + 1 параметром

void Student::setName(char *)

void Student::setName(char *, const Student *)

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 18
Вказівник this

➢ При зверненні до полів компілятором також неявно використовується


вказівник this

Student::Student() {
rollNo = 0;
}

Student::Student(){
this->rollNo = 0;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 19
Вказівник this

➢ Часто виникає потреба повертати адресу поточного об’єкта з функції

➢ Тоді адресу отримують розіменуванням вказівника (*this)

Student Student::setRollNo(int aNo) {



return *this;
}
Student Student::setName(char *aName) {

return *this;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 20
Вказівник this

int main() {
Student aStudent;
Student bStudent;

bStudent = aStudent.setName(“Petryk”);

bStudent = aStudent.setName(“Ali”).setRollNo(2);

return 0;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 21
Const-функції
➢ Серед функцій-членів класу можуть бути функції, призначені лише для
читання (read-only)

➢ У такому разі має існувати механізм виявлення помилок, якщо такі


функції випадково змінять дані об’єкта

➢ Для оголошення функції константною використовують ключове слово


const, яке розміщують після списку параметрів

Оголошення
class ClassName {
ReturnVal Function() const;
};

Реалізація
ReturnVal ClassName::Function() const {

}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 22
Const-функції

class Student {
public:
int getRollNo() const {
return rollNo;
}
};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 23
Const-функції

➢ Const-методи класу не можуть змінювати стан жодного об'єкта цього


класу

➢ Використовуються лише для «читання»

➢ Помилки, пов’язані з набором коду на клавіатурі, також можуть бути


автоматично виявлені під час компіляції

bool Student::isRollNo(int aNo) {


if (rollNo == aNo){
return true;
}
return false;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 24
Const-функції

bool Student::isRollNo(int aNo) {


/* undetected typing mistake */
if(rollNo = aNo){
return true;
}
return false;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 25
Const-функції

bool Student::isRollNo(int aNo) const {


/* compiler error */
if(rollNo = aNo){
return true;
}
return false;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 26
Const-функції

➢ Const-функція не може змінювати значення жодного поля об’єкта

➢ Const-метод класу не може викликати неConst-метод цього ж класу

➢ Конструктори та деструктори класу не можуть бути const-функціями

class Date {
public:
Date() const {} // stupid error…
~Date() const {} // stupid error…
};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 27
Const-функції

➢ «Захист» реалізується передачею const-функції const-вказівника this на


поточний об’єкт

Student * const this;

const Student *const this;

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 28
«Роздільна» компіляція

➢ Функції визначаються у файлах реалізації (.cpp), тоді як оголошення


класу подається у заголовочному файлі (.h)

➢ Під «роздільною» компіляцією мають на увазі поділ інтерфейсу та


реалізації

➢ «Роздільна» компіляція дозволяє уникнути розробнику надмірного


заглиблення у технічні деталі реалізації тих чи інших функцій,
сконцентрувавши увагу на коректній взаємодії об’єктів (інтерфейсів
класів)

Student.h Student.cpp

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 29
«Роздільна» компіляція

Student.h
class Student {
int rollNo;
public:
void setRollNo(int aRollNo);
int getRollNo();

};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 30
«Роздільна» компіляція

Student.cpp
#include “student.h”

void Student::setRollNo(int aNo){



}
int Student::getRollNo(){

}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 31
«Роздільна» компіляція

Human.cpp
#include “student.h”

int main(){
Student aStudent;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 32
Ну коли ми будемо програмувати?

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 33
Короткий приклад

// Made by Spilni Zusyllia on 20/02/2021

#include <iostream>
#include <ctime>

using namespace std;

class Date {
private:
int d;
int m;
int y;

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 34
Короткий приклад

public:
Date () {
time_t now = time(0);
tm *ltm = localtime(&now);
d = ltm->tm_mday;
m = 1+ ltm->tm_mon;
y = 1900 + ltm->tm_year;
}
Date (int D, int M, int Y) {
// if ...
d = D;
m = M;
y = Y;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 35
Короткий приклад

Date (const Date& prototype) {


d = prototype.d;
m = prototype.m;
y = prototype.y;
}
~Date () {
cout << "I'm dying! Help me!" << endl;
}
void output () {
cout << d << "." << m << "." << y << endl;
}
};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 36
Короткий приклад

int main()
{
cout << "Hello world!" << endl;
Date a;
Date b (10, 21, 20321323);
Date c (b);
a.output();
b.output();
c.output();
return 0;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 37
Далі буде… ☺

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 38

You might also like