Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.
8:
Listing 6.8. Dostęp do składowych prywatnych; funkcje zaprzyjaźnione
// program t e s t u j a c y f u n k c j e z a p r z y j a z n i o n e
2 #i n cl u d e <i o s t r e a m . h>
#include <c o n i o . h>
4 #i n cl u d e <p u n k t 1 . h>
6.2. Funkcja niezależna zaprzyjaźniona z klasą
133
i n t main ( )
6
{
c o u t << " zmienna␣ automatyczna ␣ : ␣ " << e n d l ;
punkt p1 ( 1 0 , 2 0 ) ;
8
pokaz ( p1 ) ;
c o u t << " zmienna␣ dynamiczna␣ : ␣ " << e n d l ;
10
punkt ∗wsk ;
wsk = new punkt ( 2 0 , 40) ;
12
pokaz ( ∗ wsk ) ;
g e t c h ( ) ;
14
return 0 ;
}
Po uruchomieniu otrzymujemy następujący wydruk;
zmienna automatyczna :
w s p o l r z e d n e punktu : 10 20
zmienna dynamiczna :
w s p o l r z e d n e punktu : 20 40
W pokazanym programie przypomniano także tworzenie obiektów dyna-
micznych. W języku C++ dla każdego programu przydzielany jest pewien
obszar pamięci dla alokacji obiektów tworzonych dynamicznie. Obszar ten
jest zorganizowany w postaci kopca (ang. heap). Na kopcu alokowane są
obiekty dynamiczne. Obiekty dynamiczne tworzone są przy pomocy opera-
tora new. Operator new alokuje (przydziela) pamięć na kopcu. Gdy obiekt
nie jest już potrzebny należy go zniszczyć przy pomocy operatora delete.
Aby można było zastosować operator new należy najpierw zadeklarować
zmienną wskaźnikową, dla przykładu:
i n t
∗ wsk ;
Tworzenie zmiennej dynamicznej ma postać:
wsk = new typ ;
lub
wsk = new typ ( wart osc ) ;
gdzie typ oznacza typ zmiennej (np. int, float, itp.) Możemy deklarację
zmiennej wskaźnikowej połączyć z tworzeniem zmiennej dynamicznej:
typ ∗ wsk = newt typ ;
Tak złożona instrukcja może mieć przykładową postać:
134
6. Funkcje zaprzyjaźnione
i n t ∗wsk = new i n t ;
W pokazanym programie utworzono zmienną dynamiczną w następujący
sposób:
c o u t << " zmienna ␣ dynamiczna␣ : ␣ " << e n d l ;
punkt ∗wsk ;
wsk = new punkt ( 2 0 , 40) ;
6.3. Funkcja składowa zaprzyjaźniona z inną klasą
Funkcja zaprzyjaźniona danej klasy może być też funkcją składową zu-
pełnie innej klasy. Taka funkcja ma dostęp do prywatnych danych swojej
klasy i do danych klasy, z którą się przyjaźni. Kolejny przykład ilustruje
to zagadnienie. Mamy dwie klasy - klasę prostokat i klasę punkt. Klasa
prostokat definiuje prostokąt przy pomocy współrzędnych dwóch punktów
– lewego dolnego rogu prostokąta i prawego górnego rogu prostokąta. Kla-
sa punkt opisuje punkt na podstawie jego współrzędnych kartezjańskich.
Mając dany punkt i dany prostokąt należy określić czy punkt znajduje się
wewnątrz prostokąta czy też leży poza nim.
W programie deklarujemy dwie klasy – punkt i prostokat z konstruk-
torami. Funkcja miejsce() jest funkcją składową klasy prostakat i jest za-
przyjaźniona z klasą punkt. W programie testującym wywołujemy funkcję
miejsce(), aby ustalić położenie punktu względem prostokąta.
Listing 6.9. Dostęp do składowych prywatnych; funkcje zaprzyjaźnione
1 #i n cl u d e <i o s t r e a m >
#include <c on io >
3
using namespace s t d ;
c l a s s punkt ;
// d e k l a r a c j a z a p o w i a d a j a c a
5
c l a s s p r o s t o k a t
7
{ i nt xp , yp , xk , yk ;
public :
9
p r o s t o k a t ( i nt xpo , i nt ypo , i nt xko , i nt yko ) ;
void m i e j s c e ( punkt &p ) ;
11
} ;
c l a s s punkt
13
{ i nt x1 , y1 ;
public :
15
punkt ( i nt ax , i nt ay ) ;
friend void p r o s t o k a t : : m i e j s c e ( punkt &p ) ;
17
} ;
6.3. Funkcja składowa zaprzyjaźniona z inną klasą
135
19
p r o s t o k a t : : p r o s t o k a t ( i nt xpo , i nt ypo , i nt xko , i nt yko )
{ xp = xpo ;
yp = ypo ;
21
xk = xko ;
yk = yko ;
}
23
punkt : :
punkt ( i nt ax , i nt ay )
25
{
x1 = ax ;
y1 = ay ;
}
27
void p r o s t o k a t : : m i e j s c e ( punkt &pz )
29
{
i f (
( pz . x1 >= xp ) && ( pz . x1 <= xk )
&&
31
( pz . y1 >= yp ) && ( pz . y1 <= yk )
)
33