140 likes | 292 Views
static, const, volatile. Static – zmienne klasowe. zmienna 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. class ST {
E N D
Static – zmienne klasowe • zmienna 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
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)
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
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"; } }; Static – metody
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; ST::ile_nas(); a.ile_nas(); a.wszystko(); }
const, volatile • const --- stałe const int ci =7; • volatile --- ulotne volatile int vi=8; i++; i--; i=i+0;
const, volatile • obiekty również mogą być stałe bądź ulotne • na 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;
class CV { int i; public: CV(int i=1) :i(i) { }; void out() { cout << i; } void out() const volatile { cout << i; } void inc() { i++; } void inc_c() const { // i++; // i jest const } void inc_v() volatile { i++; } void inc_cv() const volatile { // i++; } };
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(); }
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;
Przykład: pola const i static class 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
info::info() :nr(++serial) { cntr++; cout << "\nkonstruktor bezparametrowy obiektu nr" << nr; cout << " jest " << cntr << " obiektow info"; cout.flush(); } info::info(const info & i) :nr(++serial) { cntr++; cout << "\nkonstruktor kopiujacy obiektu nr" << nr << " z obiektu " << i.nr; cout << " jest " << cntr << " obiektow info"; cout.flush(); }
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"; cout.flush(); return *this; }