LEKCJA 33: WSKANIKI DO OBIEKTÓW. ________________________________________________________________ W trakcie tej lekcji dowiesz się, jak posługiwać się obiektami za porednictwem wskaników. ________________________________________________________________ Wskaniki do obiektów funkcjonujš podobnie jak wskaniki do struktur. Operator -> pozwala na dostęp zarówno do danych jak i do funkcji. Dla przykładu wykorzystamy obiekt naszej prywatnej klasy Licznik. class Licznik { public: char moja_litera; int ile; Licznik(char znak) { moja_litera = z; ile = 0; } void Skok_licznika(void) { ile++; } }; Aby w programie można było odwołać się do obiektu nie poprzez nazwę a przy pomocy wskanika, zadeklarujemy wskanik do obiektów klasy Licznik: Licznik *p; Wskanik w programie możemy zastosować np. tak: p->Skok_licznika(); (czytaj: Wywołaj metodę "Skok_licznika()" w stosunku do obiektu wskazywanego w danym momencie przez wskanik p) Trzeba pamiętać, że sama deklaracja w przypadku referencji i wskaników nie wystarcza. Przed użyciem należy jeszcze zainicjować wskanik w taki sposób, by wskazywał na nasz obiekt-licznik. Wskanik do obiektu inicjujemy w taki sam sposób jak każdy inny pointer: p = &Obiekt; Możemy przystšpić do utworzenia programu przykładowego. [P119.CPP] # include "ctype.h" # include "iostream.h" class Licznik { public: char moja_litera; int ile; Licznik(char z) { moja_litera = z; ile = 0; } void Skok_licznika(void) { ile++; } }; void main() { char znak; cout << "\nPodaj litere do zliczania: "; cin >> znak; Licznik Obiekt1(znak), Obiekt2('a'), *p1, *p2; p1 = &Obiekt1; p2 = &Obiekt2; cout << "\n Wpisz ciag znakow"; cout << "zakonczony kropka [.] i [Enter] \n"; for(;;) { cin >> znak; if(znak == '.') break; if(znak == p1->moja_litera) p1->Skok_licznika(); if(znak == p2->moja_litera) p2->Skok_licznika(); } cout << "\nBylo " << p1->ile; cout << " liter: " << p1->moja_litera; p1 = p2; cout << "\nBylo " << p1->ile; cout << " liter: " << p1->moja_litera; } Możemy oczywicie np. stosować przypisanie, inkrementować i dekrementować pointer oraz realizować arytmetykę na wskanikach dokładnie tak samo, jak w przypadku innych zmiennych. this - WSKANIK SPECJALNY. Powięcimy teraz chwilę uwagi pewnemu specjalnemu wskanikowi. Specjalnemu (i ważnemu) na tyle, że aż "dorobił się" w C++ własnego słowa kluczowego "this". Każdej funkcji - metodzie zadeklarowanej wewnštrz klasy zostaje w momencie wywołania w niejawny sposób (ang. implicitly) przekazany wskanik do obiektu (w stosunku do którego funkcja ma zadziałać). Pointer wskazuje funkcji w pamięci ten obiekt, którego członkiem jest dana funkcja. Bez istnienia takiego włanie wskanika nie moglibymy stosować spokojnie funkcji, nie moglibymy odwoływać się do pola obiektu, gdybymy nie wiedzieli jednoznacznie, o który obiekt chodzi. Program posługuje się automatycznie niejawnym wskanikiem do obiektu (ang. implicit pointer). Możemy wykorzystać ten istniejšcy, choć do tej pory nie widoczny dla nas pointer posługujšc się słowem kluczowym this (ten). This pointer wskazuje na obiekt, do którego należy funkcja. Korzystajšc z tego wskanika funkcja może bez cienia wštpliwoci zidentyfikować włanie ten obiekt, z którym pracuje a nie obiekt przypadkowy. [!!!] FUNKCJE KATEGORII static NIE OTRZYMUJĽ POINTERA this. Należy pamiętać, że wskanik this istnieje wyłšcznie podczas wykonywania metod (ang. class member function execution), za wyjštkiem funkcji statycznych. Jeli w programie zadeklarujemy klasę Klasa: class Klasa { int dane; ... } a wewnštrz tej klasy metodę Pokazuj(): class Klasa { int dane; public: void Pokazuj(); ... } void Klasa::Pokazuj(void) { cout << dane; } To zdefiniowanie funkcji Pokazuj() z zastosowaniem pointera this i notacji wskanikowej (p->), jak poniżej, będzie równoważne: void Klasa::Pokazuj(void) { cout << this->dane; } Przypomnijmy, że taka notacja wskanikowa oznacza: "Wyprowad zawartoć pola "dane" obiektu, na który wskazuje wskanik" (ponieważ jest to wskanik this, więc chodzi o własny obiekt).
Infesto