Слайд 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. Об'єктне програмування. Права доступу
Висновок
Завжди ведіть облік об'єктам,
слідкуйте за їх створенням, копіюванням і видаленням
Поділ класу на методи і утиліти є важливою проблемою проектування класів
Не можна доповнити чужий клас методом, а лише утилітою