SlideShare una empresa de Scribd logo
1 de 38
Бублик Володимир Васильович

            Програмування - 2

 Лекція 3. Об'єктне програмування.

                        Права доступу




Лекції для студентів 2 курсу
Оголошення

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

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



© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу            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);
•   }
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу        3
Звідки що видно?

•   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);
•   }
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу        4
Для чого закрита частина в заголовному файлі?

• #include “Date.h”

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

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

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




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

Уявімо собі, що атрибути

public:
• int _day, _month, _year;

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




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

• Date myDay(18, 2, 2006);

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

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



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

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

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

•    якщо атрибут некоректний, функція fillDate створить
     аварійну ситуацію,
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу   9
Для чого закривають методи?

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

• 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;
•}
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу   10
Приклади використання закритого методу

• Різні види конструкторів забезпечують інтерфейс до
  одного і того ж методу
• 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);
•}
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу   11
Атрибути об'єкту

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

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

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

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

Виклик конструктора
• Date Date::defaultDate;// = Date();
• bool Date::defaultSet = false;
• void Date::fillDate(int d, Month m, int y)
•{
•    if (!defaultSet)
•    {
•            defaultSet =true;
•            setDefault();
•    }
• ……………………………………………
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу   14
#include <ctime>

• 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;
•}
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу        15
Обробка параметрів у конструкторі

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



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




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

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

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




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

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

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

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

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




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

• Тільки працедавець Employer має право створити
  робоче місце Employee і призначити особу Person на
  певну посаду Position

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

• Тільки бухгалтеру Accountant, а точніше його методу
  нарахування зарплати payroll (const Employee &)
  доступна інформація про заробітну плату посади, яку
  займає службовець
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу        20
Службовець

•   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;
•   };
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу            21
Працедавець.1

• class Employer
•{
•      friend void Accounter::payroll();

• private:
•      Accounter * _accounter;
•      int _volume;
•      struct Staff;      //Hidden implementation
•      Staff * _office;   // *** pimpl



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

• public:
•     Employer(int volume);
•     ~Employer();
•     void hire
•             (const Person &, const Position &);
•     void fire(int);
•     void pay();
• };




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

•   class Position
•   {
•   friend void Accounter::payroll(const Employee&);
•   private:
•        const int _len;
•        string _name;
•        int _salary;
•        int getSalary() const;




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

• public:
•     string getPositionName() const;
•     Position(int, char [], int);
•     ~Position();
• };




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

•   class Person
•   {
•   private:
•        const int _len;
•        string _name;
•   public:
•        string getName() const;
•        Person(int, char []);
•        ~Person();
•   };

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

• class Accountant
•{
• private:
•      void payroll (const Employee &);
•      const Employer & _myEmployer;

• public:
•     Accountant (Employer & employer):
                     _myEmployer(employer){};
•     ~Accountant ()
•     void payroll();
• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу          27
Висновки

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

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




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

•   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();
•   };

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

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

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




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

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

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

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


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

• 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
© Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу        32
Методи

• 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 );
•}



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

• 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() );
•}



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

• 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() );
•}



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

• Замість
                    u.operator==(v),
• як і раніше пишемо
                         u == v;
• (до u добираємося через this)

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

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

• class InventList
•{
• friend class Point;

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

• Див. Lab3

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

• Завжди ведіть облік об'єктам, слідкуйте за їх
  створенням, копіюванням і видаленням

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

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




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

Más contenido relacionado

La actualidad más candente

Ptesentation!
Ptesentation!Ptesentation!
Ptesentation!
PRInfo
 
Competitions Cloudwatcher_new
Competitions Cloudwatcher_newCompetitions Cloudwatcher_new
Competitions Cloudwatcher_new
guest18d24c
 
Technology Introduction Cft Bank Object
Technology Introduction Cft Bank ObjectTechnology Introduction Cft Bank Object
Technology Introduction Cft Bank Object
guest206097a
 
Додаток 2. Правила ВКСС
Додаток 2. Правила ВКССДодаток 2. Правила ВКСС
Додаток 2. Правила ВКСС
ssuser6d3afb
 
Презентация по вопросу " Групповое поведение"
Презентация по вопросу " Групповое поведение"Презентация по вопросу " Групповое поведение"
Презентация по вопросу " Групповое поведение"
pasinkova
 
iKS-Consulting Games Rating 2008 for Russia
iKS-Consulting Games Rating 2008 for RussiaiKS-Consulting Games Rating 2008 for Russia
iKS-Consulting Games Rating 2008 for Russia
Procontent.Ru Magazine
 
Novokuznetck Enns A.V.
Novokuznetck Enns A.V.Novokuznetck Enns A.V.
Novokuznetck Enns A.V.
enns25
 

La actualidad más candente (18)

Ptesentation!
Ptesentation!Ptesentation!
Ptesentation!
 
Rozklad11012021
Rozklad11012021Rozklad11012021
Rozklad11012021
 
Konspekt
KonspektKonspekt
Konspekt
 
Competitions Cloudwatcher_new
Competitions Cloudwatcher_newCompetitions Cloudwatcher_new
Competitions Cloudwatcher_new
 
Technology Introduction Cft Bank Object
Technology Introduction Cft Bank ObjectTechnology Introduction Cft Bank Object
Technology Introduction Cft Bank Object
 
Rozklad18012021
Rozklad18012021Rozklad18012021
Rozklad18012021
 
Додаток 2. Правила ВКСС
Додаток 2. Правила ВКССДодаток 2. Правила ВКСС
Додаток 2. Правила ВКСС
 
Презентация по вопросу " Групповое поведение"
Презентация по вопросу " Групповое поведение"Презентация по вопросу " Групповое поведение"
Презентация по вопросу " Групповое поведение"
 
вікові проблеми підлітків
вікові проблеми підлітківвікові проблеми підлітків
вікові проблеми підлітків
 
г. семёнов, ул. заводская, д. 14
г. семёнов, ул. заводская, д. 14г. семёнов, ул. заводская, д. 14
г. семёнов, ул. заводская, д. 14
 
анкета
анкетаанкета
анкета
 
MTS 2008 Financial Results
MTS 2008 Financial ResultsMTS 2008 Financial Results
MTS 2008 Financial Results
 
iKS-Consulting Games Rating 2008 for Russia
iKS-Consulting Games Rating 2008 for RussiaiKS-Consulting Games Rating 2008 for Russia
iKS-Consulting Games Rating 2008 for Russia
 
Novokuznetck Enns A.V.
Novokuznetck Enns A.V.Novokuznetck Enns A.V.
Novokuznetck Enns A.V.
 
Zepter Tuttoluxo Manual
Zepter Tuttoluxo ManualZepter Tuttoluxo Manual
Zepter Tuttoluxo Manual
 
Decree 8 43_7
Decree 8 43_7Decree 8 43_7
Decree 8 43_7
 
Центри 4.0 на базі Технічних університетів
Центри 4.0 на базі Технічних університетівЦентри 4.0 на базі Технічних університетів
Центри 4.0 на базі Технічних університетів
 
Огляд актуальної судової практики Касаційного цивільного суду у складі Верхов...
Огляд актуальної судової практики Касаційного цивільного суду у складі Верхов...Огляд актуальної судової практики Касаційного цивільного суду у складі Верхов...
Огляд актуальної судової практики Касаційного цивільного суду у складі Верхов...
 

Destacado (7)

11 Iterated Containers
11 Iterated Containers11 Iterated Containers
11 Iterated Containers
 
CIM Digital PR Bootcamp part 2 Crisis Management 5 November
CIM Digital PR Bootcamp part 2 Crisis Management 5 NovemberCIM Digital PR Bootcamp part 2 Crisis Management 5 November
CIM Digital PR Bootcamp part 2 Crisis Management 5 November
 
05 Arrays
05 Arrays05 Arrays
05 Arrays
 
Seo for Wordpress - Wordcamp Montreal 2012
Seo for Wordpress - Wordcamp Montreal 2012Seo for Wordpress - Wordcamp Montreal 2012
Seo for Wordpress - Wordcamp Montreal 2012
 
03 Constants And Variables
03 Constants And Variables03 Constants And Variables
03 Constants And Variables
 
02 Copying Objects
02 Copying Objects02 Copying Objects
02 Copying Objects
 
Corporate Social Media Strategy
Corporate Social Media StrategyCorporate Social Media Strategy
Corporate Social Media Strategy
 

Más de olegapster

10 Polymorphism
10 Polymorphism10 Polymorphism
10 Polymorphism
olegapster
 
09 Object And Class Hierarchy
09 Object And Class Hierarchy09 Object And Class Hierarchy
09 Object And Class Hierarchy
olegapster
 
06 Pointers To Class Members
06 Pointers To Class Members06 Pointers To Class Members
06 Pointers To Class Members
olegapster
 
05 Operations And Utilities
05 Operations And Utilities05 Operations And Utilities
05 Operations And Utilities
olegapster
 
04 Object Hierarchy
04 Object Hierarchy04 Object Hierarchy
04 Object Hierarchy
olegapster
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulation
olegapster
 
07 Localisation
07 Localisation07 Localisation
07 Localisation
olegapster
 
06 Data Structures
06 Data Structures06 Data Structures
06 Data Structures
olegapster
 
09 Static Polymorphism
09 Static Polymorphism09 Static Polymorphism
09 Static Polymorphism
olegapster
 
02 Arithmetic Data Types
02 Arithmetic Data Types02 Arithmetic Data Types
02 Arithmetic Data Types
olegapster
 

Más de olegapster (15)

10 Polymorphism
10 Polymorphism10 Polymorphism
10 Polymorphism
 
09 Object And Class Hierarchy
09 Object And Class Hierarchy09 Object And Class Hierarchy
09 Object And Class Hierarchy
 
08 Templates
08 Templates08 Templates
08 Templates
 
06 Pointers To Class Members
06 Pointers To Class Members06 Pointers To Class Members
06 Pointers To Class Members
 
07 Containers
07 Containers07 Containers
07 Containers
 
05 Operations And Utilities
05 Operations And Utilities05 Operations And Utilities
05 Operations And Utilities
 
04 Object Hierarchy
04 Object Hierarchy04 Object Hierarchy
04 Object Hierarchy
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulation
 
08 Functions
08 Functions08 Functions
08 Functions
 
07 Localisation
07 Localisation07 Localisation
07 Localisation
 
06 Data Structures
06 Data Structures06 Data Structures
06 Data Structures
 
09 Static Polymorphism
09 Static Polymorphism09 Static Polymorphism
09 Static Polymorphism
 
04 Operators
04 Operators04 Operators
04 Operators
 
02 Arithmetic Data Types
02 Arithmetic Data Types02 Arithmetic Data Types
02 Arithmetic Data Types
 
01 Paradigms
01 Paradigms01 Paradigms
01 Paradigms
 

03 Right Of Access

  • 1. Бублик Володимир Васильович Програмування - 2 Лекція 3. Об'єктне програмування. Права доступу Лекції для студентів 2 курсу
  • 2. Оголошення Для студентів другого курсу відкрито форум з об'єктно- орієнтованого програмування 3. Зайти на сторінку http://moodle.ukma.kiev.ua/ 4. Зареєструватися 5. Одержати електронною поштою підтвердження 6. Записатися на курс об'єктно-орієнтованого програмування 7. Спілкуватися © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 2
  • 3. Звідки що видно? • 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); • } © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 3
  • 4. Звідки що видно? • 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); • } © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 4
  • 5. Для чого закрита частина в заголовному файлі? • #include “Date.h” • int main() • { • Date today(22,1,2007); • // Як виділити пам’ять під today, не знаючи • // типів кожного з атрибутів? • cout<<today<<endl; • return 0; • } © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 5
  • 6. Закриті атрибути • Закриті атрибути, розміщені в заголовному файлі, видимі всім, хто має доступ до заголовного файлу • Закриті атрибути доступні для використання лише членам класу, а також функціям або класам, яким надані для цього спеціальні повноваження (friends) • Закриті атрибути можна зробити невидимими, якщо перейти до указників (ідіома pimple ― pointer to implementation) © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 6
  • 7. Для чого закривають атрибути? Уявімо собі, що атрибути public: • int _day, _month, _year; стануть відкритими. © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 7
  • 8. Доступні для неконтрольованого спотворення • Date myDay(18, 2, 2006); Якщо атрибути відкриті, то зміну їх значень користувачем, яка може привести до некоректності, важко контролювати • myDay._day = 32; • myDay._month = 13; • myDay._year = 3333; © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 8
  • 9. Доступ за допомогою модифікатора Модифікатор локалізує місця можливих змін значень атрибутів та контролює їх коректність • void Date::setDay (int day) • { • fillDate(day, Month(_month), _year); • return; • } • якщо атрибут некоректний, функція fillDate створить аварійну ситуацію, © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 9
  • 10. Для чого закривають методи? • Закривають службові методи, не призначені для вживання за межами класу • 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; •} © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 10
  • 11. Приклади використання закритого методу • Різні види конструкторів забезпечують інтерфейс до одного і того ж методу • 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); •} © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 11
  • 12. Атрибути об'єкту Атрибути об'єкту, як і методи • _day, _month, _year позбавлені сенсу поза об'єктом Метод, наприклад, • fillDate; setDay(5); month(); не можна викликати без об'єкту. Метод завжди знає свій об'єкт, до якого його застосовано. Він звертається до свого об'єкту неявно (_day, _month, _year ) або через указник this (this->_day, this->fillDate(d, m, y); ) © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 12
  • 13. Статичні атрибути і методи • Статичний атрибут не належить жодному об'єкту • Статичний метод не застосовується до жодного окремого об'єкту (він не знає this) • class Date •{ • public: • static void setDefault (); //за таймером • private: • static Date defaultDate; • static bool defaultSet; •} © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 13
  • 14. Визначення статичного об'єкту Виклик конструктора • Date Date::defaultDate;// = Date(); • bool Date::defaultSet = false; • void Date::fillDate(int d, Month m, int y) •{ • if (!defaultSet) • { • defaultSet =true; • setDefault(); • } • …………………………………………… © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 14
  • 15. #include <ctime> • 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; •} © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 15
  • 16. Обробка параметрів у конструкторі Відсутні параметри дати тепер беруться з defaultDate • _day = d? d: defaultDate._day; • _month=m? m: defaultDate._month; • _year= y? y: defaultDate._year; © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 16
  • 17. Статичні методи vs. утиліти класу • Статичний метод, наприклад, Point::amount має доступ до закритої частини класу і викликається поза класом через оператор розв'язання області дії • Point :: amount(); • Утиліта класу, наприклад, ostream& operator<<(ostream&, const Point&); не має доступу до закритої частини класу і не потребує оператора розв'язання області дії © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 17
  • 18. Порушення прав доступу • Виняткові права доступу до атрибутів • Виняткові права доступу до закритих методів • Виняткові права на створення і видалення об'єктів Виняткові права можна надати • Всьому класу • Окремому методу • Позакласній функції Для надання виняткових прав потрібні серйозні підстави © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 18
  • 19. Приклад. Офіс © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 19
  • 20. Винятки • Тільки працедавець Employer має право створити робоче місце Employee і призначити особу Person на певну посаду Position • Тільки бухгалтеру Accountant, а точніше його методу нарахування зарплати payroll() працедавець Employer надає доступ до свого штатного розпису • Тільки бухгалтеру Accountant, а точніше його методу нарахування зарплати payroll (const Employee &) доступна інформація про заробітну плату посади, яку займає службовець © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 20
  • 21. Службовець • 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; • }; © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 21
  • 22. Працедавець.1 • class Employer •{ • friend void Accounter::payroll(); • private: • Accounter * _accounter; • int _volume; • struct Staff; //Hidden implementation • Staff * _office; // *** pimpl © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 22
  • 23. Працедавець.2 • public: • Employer(int volume); • ~Employer(); • void hire • (const Person &, const Position &); • void fire(int); • void pay(); • }; © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 23
  • 24. Посада.1 • class Position • { • friend void Accounter::payroll(const Employee&); • private: • const int _len; • string _name; • int _salary; • int getSalary() const; © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 24
  • 25. Посада.2 • public: • string getPositionName() const; • Position(int, char [], int); • ~Position(); • }; © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 25
  • 26. Особа • class Person • { • private: • const int _len; • string _name; • public: • string getName() const; • Person(int, char []); • ~Person(); • }; © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 26
  • 27. Бухгалтер • class Accountant •{ • private: • void payroll (const Employee &); • const Employer & _myEmployer; • public: • Accountant (Employer & employer): _myEmployer(employer){}; • ~Accountant () • void payroll(); • }; © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 27
  • 28. Висновки Для порушення прав доступу повинні бути серйозні підстави, що випливають з умови задачі Статус утиліти класу ще не дає виняткових прав • const Point operator+ (const Point & u, const Point & v) •{ • return Point ( u.x()+v.x(), u.y()+v.y() ); •} © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 28
  • 29. Груба помилка • 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(); • }; © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 29
  • 30. Невиправдане порушення прав доступу Прямий доступ до атрибутів нічого корисного не дає • Point operator+ (const Point & u, const Point & v) •{ • return Point ( u._x+v._x, u._y+v._y ); •} © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 30
  • 31. Утиліта vs. метод • Утиліта ― це функція, що обслуговує клас, але не належить до класу • Метод ― це функція-член класу, можливо, статичний • Конструктори, деструктор, присвоєння не можуть бути утилітами, вони обов'язково повинні належати класу • Багато функцій допускають визначення як утилітою, так і методом © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 31
  • 32. Утиліти • 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 © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 32
  • 33. Методи • 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 ); •} © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 33
  • 34. Методи (технологічне рішення) • 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() ); •} © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 34
  • 35. Методи (без скорочень) • 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() ); •} © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 35
  • 36. Позначення • Замість u.operator==(v), • як і раніше пишемо u == v; • (до u добираємося через this) • Нагадування. У випадку утиліти u == v; • позначає operator==(u, v); © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 36
  • 37. Вправа. Облік точок • class InventList •{ • friend class Point; • private: • InventList(); • ………………………… • }; • Див. Lab3 © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 37
  • 38. Висновок • Завжди ведіть облік об'єктам, слідкуйте за їх створенням, копіюванням і видаленням • Поділ класу на методи і утиліти є важливою проблемою проектування класів • Не можна доповнити чужий клас методом, а лише утилітою © Бублик В.В. Програмування-2. Об'єктне програмування. Права доступу 38