Бублик Володимир ВасильовичПрограмування - 2Лекція 3. Об'єктне програмування.Права доступу презентация

Содержание

© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу Оголошення Для студентів другого курсу відкрито форум з об'єктно-орієнтованого програмування Зайти на сторінку http://moodle.ukma.kiev.ua/ Зареєструватися Одержати електронною поштою підтвердження Записатися на курс

Слайд 1Бублик Володимир Васильович Програмування - 2 Лекція 3. Об'єктне програмування. Права доступу
Лекції для

студентів 2 курсу

Слайд 2© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Оголошення
Для студентів другого курсу

відкрито форум з об'єктно-орієнтованого програмування

Зайти на сторінку http://moodle.ukma.kiev.ua/
Зареєструватися
Одержати електронною поштою підтвердження
Записатися на курс об'єктно-орієнтованого програмування
Спілкуватися


Слайд 3© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Звідки що видно?
class Date
{
public:
Date

( int d =0, int m=0, int y=0);
Date (string USdate); // “yyyy/mm/dd”
Date (const Date&);
~Date();
private:
int _day, _month, _year;
void fillDate (int d, int m, int y);
}

Слайд 4© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Звідки що видно?
class Date
{
public: //Відкрита

частина видна усім
Date ( int d =0, int m=0, int y=0);
Date (string USdate); // “yyyy/mm/dd”
Date (const Date&);
~Date();
private: //Закрита частина, недоступна зовні
int _day, _month, _year;
void fillDate (int d, int m, int y);
}

Слайд 5© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Для чого закрита частина

в заголовному файлі?

#include “Date.h”

int main()
{
Date today(22,1,2007);
// Як виділити пам’ять під today, не знаючи
// типів кожного з атрибутів?
cout< return 0;
}


Слайд 6© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Закриті атрибути
Закриті атрибути, розміщені

в заголовному файлі, видимі всім, хто має доступ до заголовного файлу
Закриті атрибути доступні для використання лише членам класу, а також функціям або класам, яким надані для цього спеціальні повноваження (friends)
Закриті атрибути можна зробити невидимими, якщо перейти до указників (ідіома pimple ― pointer to implementation)

Слайд 7© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Для чого закривають атрибути?
Уявімо

собі, що атрибути

public:
int _day, _month, _year;

стануть відкритими.

Слайд 8© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Доступні для неконтрольованого спотворення
Date

myDay(18, 2, 2006);

Якщо атрибути відкриті, то зміну їх значень користувачем, яка може привести до некоректності, важко контролювати

myDay._day = 32;
myDay._month = 13;
myDay._year = 3333;

Слайд 9© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Доступ за допомогою модифікатора
Модифікатор

локалізує місця можливих змін значень атрибутів та контролює їх коректність

void Date::setDay (int day)
{
fillDate(day, Month(_month), _year);
return;
}

якщо атрибут некоректний, функція fillDate створить аварійну ситуацію,

Слайд 10© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Для чого закривають методи?
Закривають

службові методи, не призначені для вживання за межами класу

bool Date::leapYear (int y)
{
bool leap;
if (y % 4) leap=false;
else if (y % 100) leap=true;
else if (y % 400) leap=false;
else leap=true;
return leap;
}

Слайд 11© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Приклади використання закритого методу
Різні

види конструкторів забезпечують інтерфейс до одного і того ж методу
Date::Date ( int d, Month m, int y)
{
fillDate(d, m, y);
}

Date::Date ( int d, int m, int y)
{
fillDate(d, Month(m), y);
}

Слайд 12© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Атрибути об'єкту
Атрибути об'єкту, як

і методи
_day, _month, _year
позбавлені сенсу поза об'єктом

Метод, наприклад,
fillDate; setDay(5); month();
не можна викликати без об'єкту.
Метод завжди знає свій об'єкт, до якого його застосовано. Він звертається до свого об'єкту неявно (_day, _month, _year ) або через указник this (this->_day, this->fillDate(d, m, y); )

Слайд 13© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Статичні атрибути і методи
Статичний

атрибут не належить жодному об'єкту
Статичний метод не застосовується до жодного окремого об'єкту (він не знає this)
class Date
{
public:
static void setDefault (); //за таймером
private:
static Date defaultDate;
static bool defaultSet;
}

Слайд 14© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Визначення статичного об'єкту
Виклик конструктора
Date

Date::defaultDate;// = Date();
bool Date::defaultSet = false;
void Date::fillDate(int d, Month m, int y)
{
if (!defaultSet)
{
defaultSet =true;
setDefault();
}
……………………………………………

Слайд 15© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
#include
void Date::setDefault ()
{
struct

tm * today =new tm;
time_t timer;

time( &timer );
today = gmtime(&timer);

defaultDate._day = today->tm_mday;
defaultDate._month = ++(today->tm_mon);
defaultDate._year = today->tm_year+=1900;
}

Слайд 16© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Обробка параметрів у конструкторі
Відсутні

параметри дати тепер беруться з defaultDate


_day = d? d: defaultDate._day;
_month=m? m: defaultDate._month;
_year= y? y: defaultDate._year;

Слайд 17© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Статичні методи vs. утиліти

класу

Статичний метод, наприклад, Point::amount має доступ до закритої частини класу і викликається поза класом через оператор розв'язання області дії
Point :: amount();

Утиліта класу, наприклад, ostream& operator<<(ostream&, const Point&); не має доступу до закритої частини класу і не потребує оператора розв'язання області дії


Слайд 18© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Порушення прав доступу
Виняткові права

доступу до атрибутів
Виняткові права доступу до закритих методів
Виняткові права на створення і видалення об'єктів

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

Для надання виняткових прав потрібні серйозні підстави


Слайд 19© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Приклад. Офіс


Слайд 20© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Винятки
Тільки працедавець Employer має

право створити робоче місце Employee і призначити особу Person на певну посаду Position

Тільки бухгалтеру Accountant, а точніше його методу нарахування зарплати payroll() працедавець Employer надає доступ до свого штатного розпису

Тільки бухгалтеру Accountant, а точніше його методу нарахування зарплати payroll (const Employee &) доступна інформація про заробітну плату посади, яку займає службовець

Слайд 21© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Службовець
class Employee
{
friend class Employer;
private:
const

Person & _who;
const Position & _what;
Employee(const Person & who, const Position & what);
~Employee();
public:
const Person& who() const;
const Position& what() const;
};

Слайд 22© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Працедавець.1
class Employer
{
friend void Accounter::payroll();

private:
Accounter

* _accounter;
int _volume;
struct Staff; //Hidden implementation
Staff * _office; // *** pimpl



Слайд 23© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Працедавець.2
public:
Employer(int volume);
~Employer();
void hire
(const Person

&, const Position &);
void fire(int);
void pay();
};

Слайд 24© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Посада.1
class Position
{
friend void Accounter::payroll(const

Employee&);
private:
const int _len;
string _name;
int _salary;
int getSalary() const;

Слайд 25© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Посада.2
public:
string getPositionName() const;
Position(int, char

[], int);
~Position();
};

Слайд 26© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Особа
class Person
{
private:
const int _len;
string

_name;
public:
string getName() const;
Person(int, char []);
~Person();
};

Слайд 27© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Бухгалтер
class Accountant
{
private:
void payroll (const

Employee &);
const Employer & _myEmployer;

public:
Accountant (Employer & employer): _myEmployer(employer){};
~Accountant ()
void payroll();
};

Слайд 28© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Висновки
Для порушення прав доступу

повинні бути серйозні підстави, що випливають з умови задачі
Статус утиліти класу ще не дає виняткових прав

const Point operator+ (const Point & u, const Point & v)
{
return Point ( u.x()+v.x(), u.y()+v.y() );
}


Слайд 29© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Груба помилка
class Point
{
friend Point

operator+(const Point &, const Point &)
double _x;
double _y;
public:
Point (double x=0, double y=0);
Point (const Point &);
~Point();
};

Слайд 30© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Невиправдане порушення прав доступу
Прямий

доступ до атрибутів нічого корисного не дає

Point operator+ (const Point & u, const Point & v)
{
return Point ( u._x+v._x, u._y+v._y );
}


Слайд 31© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Утиліта vs. метод
Утиліта ―

це функція, що обслуговує клас, але не належить до класу
Метод ― це функція-член класу, можливо, статичний

Конструктори, деструктор, присвоєння не можуть бути утилітами, вони обов'язково повинні належати класу

Багато функцій допускають визначення як утилітою, так і методом

Слайд 32© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Утиліти
bool operator==(const Point &

u, const Point & v)
{
return ( u.x() == v.x() ) && (u.y() == v.y() );
}

const Point operator+ (const Point & u, const Point & v)
{
return Point ( u.x()+v.x(), u.y()+v.y() );
}

Утиліта не знає this

Слайд 33© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Методи
bool Point ::operator==(const Point

& u) const
{
return ( _x == u._x ) && ( _y == u._y );
}

const Point Point :: operator+ (const Point & v) const
{
return Point ( _x+v._x, _y+v._y );
}


Слайд 34© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Методи (технологічне рішення)
bool Point

::operator==(const Point & u) const
{
return ( x() == u.x() ) && ( y() == u.y() );
}

const Point Point :: operator+ (const Point & v) const
{
return Point ( x()+v.x(), y()+v.y() );
}


Слайд 35© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Методи (без скорочень)
bool Point

::operator==(const Point & u) const
{
return ( this->x() == u.x() ) && (this-> y() == u.y() );
}

const Point Point :: operator+ (const Point & v) const
{
return Point (this-> x()+v.x(), this-> y()+v.y() );
}


Слайд 36© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Позначення
Замість
u.operator==(v),
як і раніше

пишемо
u == v;
(до u добираємося через this)

Нагадування. У випадку утиліти
u == v;
позначає
operator==(u, v);

Слайд 37© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Вправа. Облік точок
class InventList
{
friend

class Point;

private:
InventList();
…………………………
};

Див. Lab3

Слайд 38© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу
Висновок
Завжди ведіть облік об'єктам,

слідкуйте за їх створенням, копіюванням і видаленням

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

Не можна доповнити чужий клас методом, а лише утилітою

Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика