Static, const, volatile.

1 static, const, volatile ...
Author: Zachariasz Ryszkiewicz
0 downloads 2 Views

1 static, const, volatile

2 Static – zmienne klasowezmienna klasowa o atrybucie static jest wspólna dla wszystkich obiektów danej klasy istnieje nawet gdy nie ma żadnego obiektu można się do niej odwoływać za pomocą operatora zakresu

3 class ST { static int s; // to jest tylko deklaracja int i; public: static int ps; // jak wyżej }; int ST::s=0, // to definicja ST::ps=0; deklaruje się w klasie, ale definiuje (już bez słowa kluczowego static) poza klasą można zdefiniować tylko raz dla bibliotek: definicje do *.cpp a dekl. klasy do *.h (nie trzeba i nie mozna dodatkowych extern ST::s)

4 Static – metody mogą wtedy być wołane, nawet gdy nie ma obiektów (za pomocą operatora zakresu) mogą korzystać jedynie ze statycznych pól i metod klasy nie ma wskaźnika this

5 Static – metody class ST { static int s; int i; public: static int ps;ST(int i=0) :i(i) s++; } static void ile_nas() { cout << s << "\n"; } void wszystko() // nie wolno static !!! cout << s << " " << i cout << " " << ps << "\n"; };

6 void main() { int i; // i=s; // nie ma ::s ani ::ps // i=ps; // i=ST::s; // private i=ST::ps; ST::ile_nas(); // ST::wszystko(); // niestatyczna metoda klasy ST a; a.ile_nas(); a.wszystko(); }

7 const, volatile const --- stałe volatile --- ulotne const int ci =7;volatile int vi=8; i++; i--; i=i+0;

8 const, volatile obiekty również mogą być stałe bądź ulotnena rzecz obiektów stałych bądź ulotnyvh można aktywować jedynie metody uprzywilejowane metody uprzywilejowane definiujemy podając po nawiasie zamykającym listę argumentów słowa kluczowe const i/lub volatile. UWAGA: uprzywilejowanie metody może powodować jej przeciążenie: int f(); int f() const;

9 class CV { int i; public: CV(int i=1) :i(i) }; void out() cout << i; } void out() const volatile void inc() { i++; } void inc_c() const // i++; // i jest const void inc_v() volatile void inc_cv() const volatile // i++; };

10 void main() { CV cv; const CV cvc; volatile CV cvv; const volatile CV cvcv; cv.inc(); cv.inc_c(); cv.inc_v(); cv.inc_cv(); // cvc.inc(); cvc.inc_c(); // cvc.inc_v(); cvc.inc_cv(); // cvv.inc(); // cvv.inc_c(); cvv.inc_v(); cvv.inc_cv(); // cvcv.inc(); // cvcv.inc_c(); // cvcv.inc_v(); cvcv.inc_cv(); cv.out(); //CV::out(); cvc.out(); //CV::out() const volatile; cvv.out(); cvcv.out(); }

11 int f() const; // int f() const volatile;metody uprzywilejowane nie mogą być static. konstruktor ani destruktor nie może być const volatile ani static. deklarowanie metod uprzywilejowanych nie może prowadzić do niejednoznaczności int f() const; // int f() const volatile;

12 Przykład: pola const i staticclass info { static int cntr, // licznik istniejacych obiektow serial; // statyczna zmienna pomocnicza const int nr; // unikalny numer seryjny obiektu public: info(); info(const info & i); ~info(); info & operator=(const info &p); }; int info::cntr=0, // static info::serial=0; // static

13 info::info() :nr(++serial) { cntr++; cout << "\nkonstruktor bezparametrowy obiektu nr" << nr; cout << " jest " << cntr << " obiektow info"; cout.flush(); } info::info(const info & i) cout << "\nkonstruktor kopiujacy obiektu nr" << nr << " z obiektu " << i.nr;

14 info::~info() { cntr--; cout << "\ndestruktor obiektu nr" << nr; cout << " zostanie " << cntr << " obiektow info"; cout.flush(); } info & info::operator=(const info &p) cout << "\noperator przypisania do obiektu nr " << nr; cout << " z obiektu nr" << p.nr; cout << " jest " << cntr << " obiektow info"; return *this;