330
Dodatek A
Complat x), to dostęp do jego pól odbywałby się za pomocą notacji z kropką. Przykład: x.Re.
complcx.cpp
void Complex::wypi3Z()
<
cout << Re << "+j*" « im « endl;
I
Język C++ umożliwia łatwe przedefilowanie znaczenia operatorów standardowych, tak aby operacje na obiektach uczynić możliwie najprostszymi. Ponieważ liczby zespolone nieco inaczej dodaje się niż te „zwykłe”, celowe będzie ukrycie sposobu dodawania w funkcji, a w świecie zewnętrznym pozostawienie do tego celu operatora +. Najwygodniejszym sposobem przedefiniowania operatora dwuargumentowego jest użycie do tego celu tzw. funkcji zaprzyjaźnionej; jest to specjalna funkcja, która nie będąc metodą" pewnej określonej klasy, może operować obiektami należącymi do niej. Dotyczy to również dostępu do pól prywatnych!
Nasza funkcja zaprzyjaźniona ma następujące działanie: dwa obiekty * i y są przekazywane jako parametry. Odczytując wartości ich pól Re i Im, możliwe jest skonstruowanie nowego obiektu klasy Complex wg prostego wzoru: (a+j*b)+(c+j*d)= (a+cj+(h+d) *j. Jest to matematyka elementarna, zawarta w' programie nauczania szkoły średniej. Po utworzeniu, nowy obiekt jest zwracany przez referencję - czyli jako w pełni adresowalny obiekt, który może być przypisany innemu obiektowi, na którego rzecz może być aktywowana jakaś metoda klasy Complex etc. Prawidłowe będą zatem instrukcje:
Complex x(1,2),y(Z,3),c; // deklaracje obiektów c=x+y; // c-<l+2)ij*(2+3)
Popatrzmy na listing funkcji +:
Complexs operator +(Complex x,Complex y)
(
double tmp_Re-x.Czesc_Rzecz()+y.Czesc RzeczO; double tmp_Im=x.Czesc_Uroj<) +y.Czesc_Uroj<);
Complex *-NowyObiekt“new Complex(tmp_Re,tmp lm); return (‘NowyObiekt);
>
Warto zwrócić uwagę na fakt, iż obiekt NowyObiekt jest tworzony w sposób jawny przy pomocy new. Tego typu postępowanie zapewnia nam, że zwrócona referencja będzie się odnosiła do obiektu trwałego (zwykła instrukcja Complex NowyObiekt użyta wewnątrz bloku stworzyłaby obiekt tymczasowy, który zniknąłby po wykonaniu instrukcji zawartych we wspomnianym bloku).
" W konsekwencji nie mogą być wywoływane za pomocą notacji „z kropką”!