Your SlideShare is downloading. ×
06 Pointers To Class Members
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

06 Pointers To Class Members

273
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
273
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
1
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×