JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 11 1
Lista inicjalizacyjna knstruktra W klasie mgą być również stałe dane składwe (zadeklarwane jak cnst). Np.: KONSTRUKTORY I DESTRUKTORY Dane stałe muszą być zainicjalizwane! wykład 5: class Material { cnst flat mdul_yunga; //... }; Tak nie mżna: class Material { //cnst flat mdul_yunga=2e5; // Błąd! }; 2
KONSTRUKTORY I DESTRUKTORY Lista inicjalizacyjna knstruktra W tym przypadku d knstruktra muszą być dstarczne dpwiednie inicjalizatry, które zstaną wykrzystane jak wartści pczątkwe. Inicjalizacji danych stałych dknuje się za pmcą tzw. listy inicjalizacyjnej knstruktra w pstaci: np.: klasa::klasa(argumenty) : lista_inicjalizacyjna Klasa::Klasa(int a, int b, int c):dana1(a),dana2(b) // inicjalizacja { dana3=c; // przypisanie }; przy czym: class Klasa { cnst int dana1; // stała dana składwa cnst int dana2; // stała dana składwa int dana3; // zwykła dana składwa public: Klasa(int, int, int); }; 3
KONSTRUKTORY I DESTRUKTORY Lista inicjalizacyjna knstruktra Lista inicjalizacyjna pjawia się tylk w definicji knstruktra w deklaracji nie występuje! Lista inicjalizacyjna kreśla, jak zainicjalizwać niestatyczne składniki klasy ( składnikach statycznych później...). Zatem dane stałe muszą być inicjalizwane, pzstałe niestatyczne dane mgą być inicjalizwane za pmcą listy inicjalizacyjnej knstruktra. Knstruktr jak funkcja jest wyknywany w 2 etapach: 1. Inicjalizacja składników (za pmcą listy inicjalizacyjnej). 2. Przypisania i inne działania (wyknywane w ciele knstruktra). 4
KONSTRUKTORY I DESTRUKTORY Przykład: 5
KONSTRUKTORY I DESTRUKTORY Przykład: 6
SKŁADNIKI STATYCZNE KLASY Statyczna dana składwa: T dana składwa zadeklarwana jak static, np.: static int licznik; Dana taka jest twrzna w pamięci jednkrtnie i jest daną wspólną dla wszystkich biektów klasy (niejak glbalną daną klasy). Dlaczeg nie zmienna glbalna? - zmienne glbalne są dstępnie nie tylk dla klasy; - zbyt wiele zmiennych glbalnych nie świadczy dbrym stylu prgramwania; 7
SKŁADNIKI STATYCZNE KLASY Statyczna dana składwa: Deklaracja składnika statyczneg w brębie klasy nie jest jeg definicją. Definicja (już bez słwa static) jest umieszczana w miejscu, w którym ma zakres pliku (sugestia: na pczątku pliku, w którym zdefiniwane są funkcje składwe klasy). Definicja taka mże zawierać inicjalizację. Odnszenie się d składnika statyczneg: Klasa::licznik lub biekt.licznik 8
SKŁADNIKI STATYCZNE KLASY Statyczna funkcja składwa: np.: static int plicz(); Jeśli w klasie jest funkcja, która peruje wyłącznie na statycznych danych składwych klasy, t mżna ją zadeklarwać jak statyczną. np. jeśli istnieje składnik statyczny: static int licznik; t definicja statycznej funkcji składwej plicz() mże mieć pstać: int plicz() { return licznik;} P c? Funkcję taką mżna wywłać nie tylk na rzecz knkretneg biektu, ale również na rzecz samej klasy (nawet, jeśli nie istnieje żaden biekt tej klasy!): cut<<klasa::plicz(); 9
SKŁADNIKI STATYCZNE KLASY Przykład: 10
STAŁE F. SKŁADOWE I OBIEKTY Stała funkcja składwa: funkcja która biecuje nie mdyfikwać danych składwych biektów, na rzecz których zstała wywłana, np.: int Klasa::zwrc() cnst {return dana;} Stały biekt: mżna kreślić, że biekt ma być stały za pmcą słwa kluczweg cnst, np.: cnst Czas pludnie(12,0,0); Próba mdyfikacji stałeg biektu zakńczy się błędem składni. Na rzecz biektów stałych mżna wywłać tylk funkcję, która także zstała zadeklarwana jak cnst. Nawet jeśli jakaś funkcja nie mdyfikuje stałeg biektu (np. tylk zwraca lub wyświetla wynik), musi być funkcją stałą. 11
STAŁE F. SKŁADOWE I OBIEKTY Przykład: 12
FUNKCJE ZAPRZYJAŹNIONE Czasami dgdne jest, by jakaś funkcja spza danej klasy miała dstęp d składników prywatnych tej klasy. Funkcję taką dana klasa musi kreślić jak zaprzyjaźniną. Funkcja zaprzyjaźnina z klasą t funkcja, która mim, że nie jest składnikiem klasy, ma dstęp d wszystkich, nawet prywatnych składników klasy. T nie funkcja twierdzi, że jest zaprzyjaźnina z klasą! T klasa deklaruje, że przyjaźni się z tą funkcją i nadaje jej praw dstępu d wszystkich składników... 13
FUNKCJE ZAPRZYJAŹNIONE Deklarację funkcji zaprzyjaźninej umieszcza się wewnątrz definicji klasy, d której danych ma mieć dstęp, a nazwę tej funkcji pprzedza się słwem friend: class Nasza_klasa { //... friend vid przyjaciel(nasza_klasa &); //... }; Aby dnieść się d składnika klasy, z którą się przyjaźni, funkcja zaprzyjaźnina musi psłużyć się peratrem. lub peratrem > : biekt.skladnik wskaznik >skladnik 14
FUNKCJE ZAPRZYJAŹNIONE Przykład: 15
FUNKCJE ZAPRZYJAŹNIONE Krzyści: Dzięki funkcjm zaprzyjaźninym mżna nadać dstęp d prywatnych składników klasy nawet takim funkcjm, które są napisane w innym języku prgramwania (Frtran, Pascal, asembler, itp.). Funkcja zaprzyjaźnina mże być przyjacielem więcej niż jednej klasy, czyli mże mieć dstęp d prywatnych składników kilku klas! Funkcja zaprzyjaźnina mże być zwykłą funkcją, a mże być też funkcją składwą innej klasy (ma wtedy dstęp d prywatnych składników zarówn swjej klasy jak i tej klasy, z którą się przyjaźni). 16
FUNKCJE ZAPRZYJAŹNIONE Jeśli funkcja ma mieć dstęp d składników prywatnych dwóch klas, t mamy d wybru: - funkcja jest przyjacielem bu klas, - funkcja jest składnikiem jednej, a przyjacielem drugiej klasy. Deklaracja zapwiadająca (zwiastująca): Jeśli klasa nie zstała jeszcze zdefiniwana, a trzeba się d niej dnieść, wówczas należy ją wcześniej zadeklarwać (przypmnienie: w C++ każda nazwa przed użyciem musi zstać zadeklarwana) Przykład na następnym slajdzie... 17
FUNKCJE ZAPRZYJAŹNIONE Przykład (f. zaprzyjaźnina z 2 klasami): 18
FUNKCJE ZAPRZYJAŹNIONE Przykład (f. zaprzyjaźnina z 2 klasami): 19
FUNKCJE ZAPRZYJAŹNIONE Przykład (f. składwa zaprzyjaźnina z inną klasą): 20
FUNKCJE ZAPRZYJAŹNIONE Przykład (f. składwa zaprzyjaźnina z inną klasą): 21