Бублик Володимир Васильович Програмування - 2 Лекція 6. Об'єктне програмування. Типізація об'єктів   Лекції для студентів ...
Повторення <ul><li>Тип функції (оператора) визначається її (його) сигнатурою </li></ul><ul><li>Приклад . Операція додаванн...
Указники функцій <ul><li>Використовуються для того, щоб передавати функції параметрами </li></ul><ul><li>// Визначення ука...
Типи указників <ul><li>// Тип указника  PFR </li></ul><ul><li>// ( Pointer to Function with Referenced parameters ) </li><...
Визначення указників <ul><li>// Визначення указника типу  PFR </li></ul><ul><li>// ( Pointer to Function with Referenced p...
Типізація методів <ul><li>// Метод додавання </li></ul><ul><li>const  Complex Complex :: operator + </li></ul><ul><li>( co...
Тип указника методу <ul><li>// Тип указника  CPMFR </li></ul><ul><li>// ( Constant Pointer to member Function  </li></ul><...
Приклад. Текстовий екран <ul><li>// Текстовий  екран  максимальним розміром </li></ul><ul><li>// maxHeigh  х  maxWidth </l...
Атрибути екрану <ul><li>private : </li></ul><ul><li>// Наповнювач </li></ul><ul><li>static const char _filler; </li></ul><...
Перевести курсор в початок екрану <ul><li>Screen& Screen::home() </li></ul><ul><li>{ </li></ul><ul><li>_cursor=0; </li></u...
Несуттєві атрибути <ul><li>Виділимо атрибути, які з точки зору розробника не впливають на стан об'єкту </li></ul><ul><li>Я...
Парні методи <ul><li>const   Screen &  home ()  const ; </li></ul><ul><li>Screen &  home (); </li></ul><ul><li>const   Scr...
Непарні методи <ul><li>// Очистити екран </li></ul><ul><li>Screen &  clear (); </li></ul><ul><li>// Показати символ, на як...
Для чого потрібні парні методи? <ul><li>Screen v(4,4,&quot;1111222233334444&quot;); </li></ul><ul><li>v.show().set('*'). <...
Сталий результат <ul><li>До сталого результату можна застосовувати лише сталі методи </li></ul><ul><li>const  Screen cv(5,...
Указники екранних методів <ul><li>Указник довільного методу </li></ul><ul><li>typedef  Screen& (Screen::*  const  NonConst...
Застосування указника методу <ul><li>// Застосувати до екрану  s  метод  act n  разів </li></ul><ul><li>void  doAction </l...
Застосування указника сталого методу <ul><li>// Застосувати до екрану  s  сталий метод  act n  разів </li></ul><ul><li>voi...
Застосування: програмування меню <ul><li>// Меню екранних операцій </li></ul><ul><li>const  ConstAction menuConst[] =  </l...
Указники в об'єктах <ul><li>Доступ до об'єкта за указником </li></ul><ul><li>T * p =  new  T; </li></ul><ul><li>// a  атри...
Приклад. Калькулятор <ul><li>// Кишеньковий калькулятор </li></ul><ul><li>class  Calc  </li></ul><ul><li>{ </li></ul><ul><...
Реалізація операції калькулятора <ul><li>// Виконати операцію  op() </li></ul><ul><li>unsigned int  Calc::exe   ( unsigned...
Указник атрибуту <ul><li>// Указник будь-якого регістру в калькуляторі </li></ul><ul><li>typedef unsigned int  Calc::*Regi...
Застосування указника атрибуту <ul><li>// Циклічний зсув довільного регістру калькулятора </li></ul><ul><li>void   c ycleS...
Указники статичних членів класу <ul><li>Практично не відрізняються від звичайних </li></ul>
Приклад. Банк <ul><li>class  Bank </li></ul><ul><li>{ </li></ul><ul><li>friend class  CurrentAccount; </li></ul><ul><li>pr...
Приклад. Поточний рахунок <ul><li>class  CurrentAccount </li></ul><ul><li>{ </li></ul><ul><li>private : </li></ul><ul><li>...
Приклад. Конструктор <ul><li>CurrentAccount( const  Bank & bank , int  initBalance): </li></ul><ul><li>_accountNo(_freeAcc...
Висновок <ul><li>Типи позакласних функцій і нестатичних методів класу розрізняються за рахунок наявності чи відсутності мо...
Upcoming SlideShare
Loading in …5
×

06 Pointers To Class Members

435 views

Published on

Published in: Technology
1 Comment
0 Likes
Statistics
Notes
  • Glitter Graphics



    Hello, hope everything is oky by the grace of GOD im fine.its attractive yr profile ,i wanna talk to u,have a little time for me.my yahoo id is:
    gift_willian@yahoo.com
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

No Downloads
Views
Total views
435
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide

06 Pointers To Class Members

  1. 1. Бублик Володимир Васильович Програмування - 2 Лекція 6. Об'єктне програмування. Типізація об'єктів Лекції для студентів 2 курсу
  2. 2. Повторення <ul><li>Тип функції (оператора) визначається її (його) сигнатурою </li></ul><ul><li>Приклад . Операція додавання комплексних чисел </li></ul><ul><li>const Complex operator + </li></ul><ul><li>( const Complex &, const Complex &); </li></ul><ul><li>Або на два конструктори більше </li></ul><ul><li>const Complex operator + (Complex, Complex); </li></ul><ul><li>Але не </li></ul><ul><li>Complex operator + (Complex, Complex); </li></ul>Complex(1,1)+Complex(3,2) = Complex(-1,-1); Complex(1,1)+Complex(3,2) = 0; ( Complex (1,1)+ Complex (3,2)). re () =0;
  3. 3. Указники функцій <ul><li>Використовуються для того, щоб передавати функції параметрами </li></ul><ul><li>// Визначення указника функції </li></ul><ul><li>const Complex (* ptr_to_op ) </li></ul><ul><li>( const Complex &, const Complex &) = operator + ; </li></ul><ul><li>// Визначення сталого указника функції </li></ul><ul><li>const Complex (* const const_ptr_to_op ) </li></ul><ul><li>( const Complex &, const Complex &) = operator + ; </li></ul>
  4. 4. Типи указників <ul><li>// Тип указника PFR </li></ul><ul><li>// ( Pointer to Function with Referenced parameters ) </li></ul><ul><li>typedef const Complex (* PFR ) </li></ul><ul><li>( const Complex &, const Complex &); </li></ul><ul><li>// Тип указника CPFR </li></ul><ul><li>// ( Constant Pointer to Function … ) </li></ul><ul><li>typedef const Complex (* const CPFR ) </li></ul><ul><li>( const Complex &, const Complex &); </li></ul>
  5. 5. Визначення указників <ul><li>// Визначення указника типу PFR </li></ul><ul><li>// ( Pointer to Function with Referenced parameters ) </li></ul><ul><li>PFR pf = operator +; </li></ul><ul><li>// Визначення сталого указника типу С PFR </li></ul><ul><li>// ( Constant Pointer to Function with Referenced …) </li></ul><ul><li>CPFR addition = operator +; </li></ul><ul><li>Питання. Для чого потрібні сталі указники функцій? </li></ul><ul><li>Відповідь. Для правильної передачі функціональних параметрів </li></ul>
  6. 6. Типізація методів <ul><li>// Метод додавання </li></ul><ul><li>const Complex Complex :: operator + </li></ul><ul><li>( const Complex&) const ; </li></ul><ul><li>Тепер попереднє визначення указника не пройде </li></ul><ul><li>const Complex (* ptr_to_op ) </li></ul><ul><li>( const Complex &, const Complex &) = operator + ; </li></ul><ul><li>Метод знає свій об'єкт this , а утиліта не знає </li></ul>
  7. 7. Тип указника методу <ul><li>// Тип указника CPMFR </li></ul><ul><li>// ( Constant Pointer to member Function </li></ul><ul><li>// with a Referenced parameter ) </li></ul><ul><li>typedef const Complex </li></ul><ul><li>( Complex ::* const CPMFR ) ( const Complex &) const ; </li></ul><ul><li>CPMFR cp = Complex :: operator *; </li></ul><ul><li>// В об’єкті z 1 беремо метод, на який вказує </li></ul><ul><li>// указник cp , і застосовуємо його до об’єкту z 2 </li></ul><ul><li>cout <<( z 1.* cp )( z 2)<< endl ; </li></ul>
  8. 8. Приклад. Текстовий екран <ul><li>// Текстовий екран максимальним розміром </li></ul><ul><li>// maxHeigh х maxWidth </li></ul><ul><li>class Screen </li></ul><ul><li>{ </li></ul><ul><li>public : </li></ul><ul><li>// Екран заповнюється рядком pc , </li></ul><ul><li>// якщо він заданий, інакше він наповнюється </li></ul><ul><li>// наповнювачем _filler </li></ul><ul><li>Screen ( int , int , char * pc =0); </li></ul><ul><li>~ Screen (); </li></ul><ul><li>}; </li></ul>
  9. 9. Атрибути екрану <ul><li>private : </li></ul><ul><li>// Наповнювач </li></ul><ul><li>static const char _filler; </li></ul><ul><li>// Фактична висота екрану </li></ul><ul><li>int _ height ; </li></ul><ul><li>// Фактична ширина екрану </li></ul><ul><li>int _ width ; </li></ul><ul><li>// Наповнення екрану </li></ul><ul><li>char *_ wContent ; </li></ul><ul><li>// Курсор </li></ul><ul><li>mutable int _ cursor ; </li></ul>
  10. 10. Перевести курсор в початок екрану <ul><li>Screen& Screen::home() </li></ul><ul><li>{ </li></ul><ul><li>_cursor=0; </li></ul><ul><li>return * this ; </li></ul><ul><li>}; </li></ul><ul><li>// Сталий метод </li></ul><ul><li>const Screen& Screen::home() const </li></ul><ul><li>{ </li></ul><ul><li>_cursor=0; </li></ul><ul><li>return * this ; </li></ul><ul><li>}; </li></ul>
  11. 11. Несуттєві атрибути <ul><li>Виділимо атрибути, які з точки зору розробника не впливають на стан об'єкту </li></ul><ul><li>Якщо розробник вважає, що стан екрану виражається його наповненням, а не місцем розташування курсору, то визначимо відповідний атрибут як несуттєвий </li></ul><ul><li>// Курсор (несуттєвий атрибут) </li></ul><ul><li>mutable int _ cursor ; </li></ul><ul><li>Несуттєві атрибути дозволяється модифікувати навіть у сталих об'єктів </li></ul>
  12. 12. Парні методи <ul><li>const Screen & home () const ; </li></ul><ul><li>Screen & home (); </li></ul><ul><li>const Screen& move() const ; </li></ul><ul><li>Screen& move(); </li></ul><ul><li>const Screen& move( int , int ) const ; </li></ul><ul><li>Screen& move( int , int ); </li></ul><ul><li>const Screen& back() const ; </li></ul><ul><li>Screen& back(); </li></ul><ul><li>const Screen& show() const ; </li></ul><ul><li>Screen & show (); </li></ul>
  13. 13. Непарні методи <ul><li>// Очистити екран </li></ul><ul><li>Screen & clear (); </li></ul><ul><li>// Показати символ, на якому знаходиться курсор </li></ul><ul><li>// непарний метод для ілюстрації проблеми </li></ul><ul><li>const Screen& showCurrent() const ; </li></ul><ul><li>// Селектор </li></ul><ul><li>char get() const ; </li></ul><ul><li>// Модифікатор </li></ul><ul><li>Screen& set( char ); </li></ul>
  14. 14. Для чого потрібні парні методи? <ul><li>Screen v(4,4,&quot;1111222233334444&quot;); </li></ul><ul><li>v.show().set('*'). </li></ul><ul><li>// Screen& move(int, int); тому можна застосувати set </li></ul><ul><li>move(1,1).set('*'). </li></ul><ul><li>move(2,2).set('*'). </li></ul><ul><li>// showCurrent(). </li></ul><ul><li>// непарна функція, тому застосувати set не можна </li></ul><ul><li>// const Screen& showCurrent() const; </li></ul><ul><li>move(3,3).set('*'). </li></ul><ul><li>show(); </li></ul>
  15. 15. Сталий результат <ul><li>До сталого результату можна застосовувати лише сталі методи </li></ul><ul><li>const Screen cv(5,5,&quot;aaaaabbbbbcccccdddddeeeee&quot;); </li></ul><ul><li>cv.show().move(1,1).showCurrent(). </li></ul><ul><li>move(2,2).showCurrent(). </li></ul><ul><li>move(3,3).showCurrent(). </li></ul><ul><li>show(); </li></ul>
  16. 16. Указники екранних методів <ul><li>Указник довільного методу </li></ul><ul><li>typedef Screen& (Screen::* const NonConstAction) (); </li></ul><ul><li>Указник сталого методу </li></ul><ul><li>typedef const Screen & </li></ul><ul><li>(Screen::* const ConstAction) () const ; </li></ul>
  17. 17. Застосування указника методу <ul><li>// Застосувати до екрану s метод act n разів </li></ul><ul><li>void doAction </li></ul><ul><li>(Screen& s, Action act, int n) </li></ul><ul><li>{ </li></ul><ul><li>for ( int i=0; i<n; i++) </li></ul><ul><li>( s .* act )(); </li></ul><ul><li>} </li></ul>
  18. 18. Застосування указника сталого методу <ul><li>// Застосувати до екрану s сталий метод act n разів </li></ul><ul><li>void doActionConst </li></ul><ul><li>( const Screen& s, ConstAction act, int n) </li></ul><ul><li>{ </li></ul><ul><li>for ( int i=0; i<n; i++) </li></ul><ul><li>( s .* act )(); </li></ul><ul><li>} </li></ul>
  19. 19. Застосування: програмування меню <ul><li>// Меню екранних операцій </li></ul><ul><li>const ConstAction menuConst[] = </li></ul><ul><li>{ </li></ul><ul><li>Screen::home, </li></ul><ul><li>Screen::move, </li></ul><ul><li>Screen::back, </li></ul><ul><li>Screen::show </li></ul><ul><li>}; </li></ul><ul><li>// Вибір операції із меню </li></ul><ul><li>doActionConst(cv, menuConst[k], n); </li></ul>
  20. 20. Указники в об'єктах <ul><li>Доступ до об'єкта за указником </li></ul><ul><li>T * p = new T; </li></ul><ul><li>// a атрибут T </li></ul><ul><li>p -> a; </li></ul><ul><li>Доступ до методу за указником </li></ul><ul><li>T * p = new T; </li></ul><ul><li>// pf указник методу T </li></ul><ul><li>p -> * pf; </li></ul>
  21. 21. Приклад. Калькулятор <ul><li>// Кишеньковий калькулятор </li></ul><ul><li>class Calc </li></ul><ul><li>{ </li></ul><ul><li>private : </li></ul><ul><li>// Accumulator </li></ul><ul><li>unsigned int a; </li></ul><ul><li>// Register </li></ul><ul><li>unsigned int x; </li></ul><ul><li>public : </li></ul><ul><li>// Виконати операцію </li></ul><ul><li>unsigned int exe ( unsigned int (Calc::* ) ()); </li></ul><ul><li>}; </li></ul>
  22. 22. Реалізація операції калькулятора <ul><li>// Виконати операцію op() </li></ul><ul><li>unsigned int Calc::exe ( unsigned int (Calc::*op) ()) </li></ul><ul><li>{ </li></ul><ul><li>return ( this ->*op)(); </li></ul><ul><li>} </li></ul>
  23. 23. Указник атрибуту <ul><li>// Указник будь-якого регістру в калькуляторі </li></ul><ul><li>typedef unsigned int Calc::*Register; </li></ul><ul><li>// Указник регістру а в якомусь калькуляторі </li></ul><ul><li>Register ra = &Calc::a; </li></ul><ul><li>// Указник регістру x в якомусь калькуляторі </li></ul><ul><li>Register rx = &Calc::x; </li></ul><ul><li>// і сам калькулятор </li></ul><ul><li>Calc c; </li></ul>
  24. 24. Застосування указника атрибуту <ul><li>// Циклічний зсув довільного регістру калькулятора </li></ul><ul><li>void c ycleShiftL </li></ul><ul><li>// Передаємо регістр довільного калькулятора </li></ul><ul><li>( unsigned int Calc::*regPtr, Calc & c, int n) </li></ul><ul><li>{ </li></ul><ul><li>// Працюємо з переданим регістром калькулятора с </li></ul><ul><li>for ( int i= 0; i<n; ++i) </li></ul><ul><li>c.*regPtr = ( c. *regPtr >> 31)|(c.*regPtr<<=1); </li></ul><ul><li>} </li></ul><ul><li>cycleShiftL(ra, c, 5); // регістр а зсунути на 5 </li></ul><ul><li>cycleShiftL(rx, c, 10); // регістр х зсунути на 10 </li></ul>
  25. 25. Указники статичних членів класу <ul><li>Практично не відрізняються від звичайних </li></ul>
  26. 26. Приклад. Банк <ul><li>class Bank </li></ul><ul><li>{ </li></ul><ul><li>friend class CurrentAccount; </li></ul><ul><li>private : </li></ul><ul><li>const int _bankId; </li></ul><ul><li>static double _normalInterestRate; </li></ul><ul><li>static double _advancedInterestRate; </li></ul><ul><li>static double _goldInterestRate; </li></ul><ul><li>public : </li></ul><ul><li>static void raiseInterest(CurrentAccount& account); </li></ul><ul><li>}; </li></ul>
  27. 27. Приклад. Поточний рахунок <ul><li>class CurrentAccount </li></ul><ul><li>{ </li></ul><ul><li>private : </li></ul><ul><li>const int _accountNo; </li></ul><ul><li>static const _freeAccountNo; </li></ul><ul><li>const Date _openingDate; </li></ul><ul><li>int _balance; </li></ul><ul><li>const int & _bankId; </li></ul><ul><li>const double * _interestRatePtr; </li></ul><ul><li>void (* _raiseInterestPtr) (CurrentAccount&); </li></ul><ul><li>}; </li></ul>
  28. 28. Приклад. Конструктор <ul><li>CurrentAccount( const Bank & bank , int initBalance): </li></ul><ul><li>_accountNo(_freeAccountNo), </li></ul><ul><li>_balance(initBalance), </li></ul><ul><li>_bankId(bank.getId()), </li></ul><ul><li>// статичний атрибут банку </li></ul><ul><li>_interestRatePtr (&Bank::_normalInterestRate), </li></ul><ul><li>// статичний метод банку </li></ul><ul><li>// void (*) (CurrentAccount&); </li></ul><ul><li>_raiseInterestPtr (&Bank::raiseInterest) </li></ul><ul><li>{ </li></ul><ul><li>………………………………………………… . </li></ul><ul><li>}; </li></ul>
  29. 29. Висновок <ul><li>Типи позакласних функцій і нестатичних методів класу розрізняються за рахунок наявності чи відсутності можливості використовувати поточний об'єкт </li></ul><ul><li>Відсилаючи до статичних методів, вказуємо область імен класу </li></ul><ul><li>Нестатичні атрибути вимагають уточнення класу в своєму типі, оскільки для доступу до них необхідно знати об'єкт </li></ul><ul><li>Тип статичних атрибутів від класу не залежить </li></ul>

×