zesp
Transkrypt
zesp
Tematyka wykładów 1. Wprowadzenie. Klasy – cz. 1 2. Klasy – cz. 2 3. 4. 5. 6. 7. 8. Funkcje operatorowe. Wskaźnik this Dziedziczenie Polimorfizm i funkcje wirtualne Szablony Strumienie Tworzenie aplikacji w systemie Windows - Język C++. Programowanie obiektowe - Klasy i obiekty - Budowa i deklaracja klasy. Prawa dostępu - Pola i funkcje składowe - Konstruktor i destruktor - Tworzenie obiektów - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne Funkcje zaprzyjaźnione Zaprzyjaźnienie - mechanizm specyficzny dla języka C++. Funkcja zaprzyjaźniona z klasą to funkcja „zewnętrzna” zadeklarowana za pomocą słowa kluczowego friend. Może to być: • funkcja „globalna” nie należąca do żadnej klasy • funkcja składowa należąca do innej klasy class kolo { public: void oblicz1(); friend void oblicz2(kolo k); friend void punkt::oblicz3(kolo k); private: float r; }; void kolo::oblicz1() { …… } void oblicz2(kolo k) { …… } class punkt { public: void oblicz3(kolo k); }; Funkcje zaprzyjaźnione Cechy funkcji zaprzyjaźnionej: • nie należy do klasy, nie jest składową klasy • wniosek 1: kwalifikatory dostępu (public, private, protected) nie • • • • • mają znaczenia wniosek 2: nie można odwołać się do funkcji zaprzyjaźnionej poprzez nazwę kwalifikowaną (wyjątek: f. składowa innej klasy) wniosek 3: nie można jej aktywować na rzecz obiektu klasy z którą jest zaprzyjaźniona ma takie same prawa dostępu do sekcji prywatnej i chronionej jak funkcja składowa – inny mechanizm tego dostępu sens zaprzyjaźnienia: funkcja otrzymuje jako argument obiekt klasy z którą jest zaprzyjaźniona funkcja zwraca jako wynik działania obiekt klasy z którą jest zaprzyjaźniona funkcja może być zaprzyjaźniona z wieloma klasami (obiekty tych klas są argumentami funkcji) Funkcje zaprzyjaźnione class zesp { public: zesp(); zesp(float a, float b); private: float re, im; }; zesp::zesp() { re = im = 0; } zesp::zesp(float a, float b) { re = a; im = b; } Zadanie: klasę zesp należy uzupełnić o operację wypisania liczby zespolonej na ekranie. Rozwiązanie 1 FUNKCJA SKŁADOWA KLASY (FUNKCJA UDOSTĘPNIAJĄCA) class zesp { public: zesp(); zesp(float a, float b); float get_re(); float get_im(); private: float re, im; }; funkcje udostępniające tzw. gettery zesp::zesp() { re = im = 0; } zesp::zesp(float a, float b) { re = a; im = b; } float zesp::get_re() { return re; } float zesp::get_im() int main() { return im; } { zesp x(2, 5); cout << ‘(‘ << x.get_re() << ‘,‘ << x.get_im() << ‘)‘; return 0; } Rozwiązanie 2 FUNKCJA SKŁADOWA KLASY (DEDYKOWANA DLA ZADANIA) class zesp { public: zesp(); zesp(float a, float b); void wypisz(); private: float re, im; }; int main() { zesp x(2, 5); x.wypisz(); return 0; } zesp::zesp() { re = im = 0; } zesp::zesp(float a, float b) { re = a; im = b; } void zesp::wypisz() { cout << ‘(‘ << re << ‘,‘; cout << im << ‘)‘; } Rozwiązanie 3 FUNKCJA ZAPRZYJAŹNIONA Z KLASĄ class zesp { public: zesp(); zesp(float a, float b); friend void wypisz(zesp z); private: float re, im; }; int main() { zesp x(2, 5); wypisz(x); return 0; } zesp::zesp() { re = im = 0; } zesp::zesp(float a, float b) { re = a; im = b; } void wypisz(zesp z) { cout << ‘(‘ << z.re << ‘,‘; cout << z.im << ‘)‘; } Funkcje zaprzyjaźnione PRZEKAZANIE ARGUMENTU void wypisz1(zesp z) { cout << ‘(‘ << z.re << ‘,‘; cout << z.im << ‘)‘; } class zesp { public: zesp(); zesp(float a, float b); void wypisz2(zesp *z) friend void wypisz1(zesp z); { friend void wypisz2(zesp *z); cout << ‘(‘ << z->re; friend void wypisz3(zesp &z); cout << ‘,‘ << z->im << ‘)‘; } private: float re, im; }; int main() { zesp x(2, 5); wypisz1(x); wypisz2(&x); return 0; } void wypisz3(zesp &z) { cout << ‘(‘ << z.re << ‘,‘; cout << z.im << ‘)‘; } wypisz3(x); Funkcja składowa a zaprzyjaźniona zesp zesp::dodaj1(zesp z) { zesp wynik; Funkcja składowa wynik.re = re + z.re; wynik.im = im + z.im; return wynik; } return zesp(re + z.re, im + z.im); zesp dodaj2(zesp z1, zesp z2) { zesp wynik; Funkcja zaprzyjaźniona wynik.re = z1.re + z2.re; wynik.im = z1.im + z2.im; return wynik; } return zesp(z1.re + z2.re, z1.im + z2.im); Porównanie Funkcja składowa klasy deklaracja definicja wywołanie (aktywacja) zesp dodaj1(zesp z); Funkcja zaprzyjaźniona z klasą friend zesp dodaj2(zesp z1, zesp z2); zesp zesp::dodaj1(zesp z) zesp dodaj2(zesp z1, zesp z2) { { zesp wynik; zesp wynik; wynik.re = re+z.re; wynik.re = z1.re + z2.re; wynik.im = im+z.im; wynik.im = z1.im + z2.im; return wynik; return wynik; } } zesp a, b, c; c = a.dodaj1(b); zesp a, b, c; c = dodaj2(a, b); Funkcje zaprzyjaźnione Po co są funkcje zaprzyjaźnione skoro pozwalają uzyskać ten sam efekt jaki umożliwiają funkcje składowe? Cechy funkcji zaprzyjaźnionej – ciąg dalszy: • dziedziczenie: funkcja zaprzyjaźniona nie jest dziedziczona • przeciążanie operatorów: funkcje składowe nie pozwalają przeciążać niektórych operatorów w specyficzny sposób – konieczny jest inny mechanizm (funkcje zaprzyjaźnione) • mechanizm zaprzyjaźnienia: zaprzyjaźnianie całych klas