LEKCJA33.TXT

(4 KB) Pobierz
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).  
 
Zgłoś jeśli naruszono regulamin