www.imi.plsl.pl JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 7 1
WSKAŹNIKI JAKO ARGUMENTY FUNKCJI www.imi.plsl.pl Ad. 2. Przekazywanie przez wskaźnik. Funkcja pracuje na ryginale przekazywanej zmiennej, mże ją mdyfikwać; np.: vid f16(duble *a) {... // ciał funkcji } funkcja inicjalizuje wskaźnik na pdstawie przekazaneg adresu Wywłanie np.: f16(&zm); przesyłamy adres zmiennej Ad. 3. Przekazywanie przez referencję. Funkcja pracuje na ryginale przekazywanej zmiennej, mże ją mdyfikwać; więcej przy referencjach 2
WSKAŹNIKI JAKO ARGUMENTY FUNKCJI Przykład: www.imi.plsl.pl 3
REFERENCJE www.imi.plsl.pl Referencja t inna nazwa ( przezwisk ) teg sameg biektu. Pdczas definiwania referencji trzeba ją d razu zainicjalizwać: int aaa; //definicja zmiennej aaa int &ref1=aaa; //definicja referencji nazwie ref1 i jej inicjalizacja // int &ref2; //Błąd! Definicja referencji bez jej inicjalizacji Referencja nie jest kpią zmiennej, ale tą samą zmienną pd inną nazwą mdyfikacja referencji pwduje mdyfikację ryginału! Referencje są przydatne d przekazywania d funkcji argumentów, które mgą być przez tą funkcję mdyfikwane: vid funkcja17(duble &x, int &y) {... // ciał funkcji } Wywłanie np.: funkcja17(aa,bb); Uwaga! Widać, że nic nie widać (patrz przykład 2 slajdy dalej...) 4
REFERENCJE Przykład: www.imi.plsl.pl 5
REFERENCJE JAKO ARGUMENTY FUNKCJI www.imi.plsl.pl Uwaga c.d.! Sam wywłanie funkcji nie wskazuje na t, że jakiś argument jest dbierany jak referencja (czyli że funkcja mże mdyfikwać ryginał)! Przykład: 6
PRZEKAZYWANIE TABLIC DO FUNKCJI www.imi.plsl.pl Tablice (jak całść) przekazywane są d funkcji przez referencję. Tablicę przesyła się d funkcji pdając jej nazwę (czyli adres jej pczątku ) Funkcja pracuje na ryginale i mże mdyfikwać elementy tablicy. Zwykle należy jeszcze wysłać rzmiar tej tablicy. Pjedyncze elementy tablicy są dmyślnie wysyłane d funkcji przez wartść. Tablicę w funkcji mżna debrać na 2 spsby: 1. jak tablicę; 2. jak wskaźnik. 7
PRZEKAZYWANIE TABLIC DO FUNKCJI Przykład: www.imi.plsl.pl 8
PRZEKAZYWANIE TABLIC DO FUNKCJI Przykład: www.imi.plsl.pl 9
WSKAŹNIKI RZUTOWANIE www.imi.plsl.pl Operatr rzutwania (przekształacania typu) dla wskaźników: reinterpret_cast Operatr ten pzwala na knwersję jedneg typu wskaźnika na inny, np.: Dla przypmnienia peratr rzutwania static_cast : cut<<5/3; // 1 //dzielenie całkwitliczbwe cut<<static_cast<flat>(5)/3; // 1.66667 10
TABLICE WSKAŹNIKÓW www.imi.plsl.pl Wskaźniki (adresy różnych miejsc w pamięci) mżna również przechwywać w tablicach, np.: duble *tab_wsk[6]; Czytamy: tab_wsk jest 6-elementwą tablicą wskaźników mgących pkazywać na biekty typu duble. 11
WSKAŹNIKI DO FUNKCJI www.imi.plsl.pl Wskaźnik d funkcji przechwuje adres funkcji w pamięci peracyjnej kmputera. W C++ nazwa funkcji (pdbnie jak nazwa tablicy) jest pczątkwym adresem w pamięci kmputera kdu wyknująceg zadanie tej funkcji. Np.: lub: int funkcja(); //deklaracja funkcji int(*wskfun)(); //definicja wskaźnika d funkcji zauważ nawiasy! wskfun=funkcja; //ustawienie wskaźnika na funkcję int funkcja(); int(*wskfun)()=funkcja; 3 warianty wywłania funkcji: (*wskfun)(); wskfun(); funkcja(); // za pmcą wskaźnika d funkcji // za pmcą wskaźnika d funkcji // za pmcą nazwy funkcji ( klasycznie ) 12
WSKAŹNIKI DO FUNKCJI www.imi.plsl.pl Wskaźniki d funkcji mgą być: przekazywane d innych funkcji, dbierane jak rezultat wyknania funkcji, przypisywane innym wskaźnikm d funkcji. P c? Przy przesyłaniu argumentów d innych funkcji: adres funkcji mżna wysłać jak argument d innej funkcji, która ma u siebie tę przesłaną funkcję wywłać; D twrzenia tablic wskaźników d funkcji w takiej tablicy mamy niejak listę działań (funkcji) d wyknania tym za chwilę... 13
WSKAŹNIKI DO FUNKCJI Przykład: www.imi.plsl.pl 14
TABLICE WSKAŹNIKÓW DO FUNKCJI www.imi.plsl.pl Wskaźniki d funkcji mgą być elementami tablicy. Np.: vid f1(); //deklaracja funkcji vid f2(); //deklaracja funkcji vid f3(); //deklaracja funkcji vid(*twf[3])(); // definicja tablicy wskaźników d funkcji twf[0]=f1; //ustawienie elementu tablicy na funkcję 1 twf[1]=f2; //ustawienie elementu tablicy na funkcję 2 twf[2]=f3; //ustawienie elementu tablicy na funkcję 3 lub: vid f1(); vid f2(); vid f3(); vid(*twf[3])()={f1,f2,f3}; 2 warianty wywłania funkcji (tu: w pętli): fr(int i=0; i<3; ++i) (*twf[i])(); // uwaga na nawiasy! //lub fr(int i=0; i<3; ++i) twf[i](); // mżna prściej... 15
INSTRUKCJA typedef www.imi.plsl.pl Instrukcja typedef pzwala nadać nwą nazwę istniejącemu typwi: typedef flat mj_typ; // nadajemy nwą nazwę typwi flat mj_typ zm1, zm2; // i krzystamy z teg (np. wielkrtnie w prgramie) // t sam c: flat zm1, zm2; P c? Jeśli chcemy np. zwiększyć dkładnść bliczeń t wystarczy : typedef duble mj_typ; Mżna też twrzyć nwe nazwy dla typów pchdnych: typedef int *wsk_d_int; wsk_d_int w1; // (czyli: int *w1; 16
OPERATOR sizef Operatr sizef zwraca rzmiar biektu (w bajtach) : www.imi.plsl.pl flat a; lng duble b; cut sizef(a); // 4 cut sizef(b); // 12 Lub (wywłanie na rzecz typu): cut sizef(flat); // 4 cut sizef(lng duble); // 12 Przydatne też jeśli twrzymy własne typy (klasy), np. jeśli mamy klasę Zwierze : cut sizef(zwierze); // 8 A jeśli istnieje jakiklwiek biekt klasy Zwierze: cut sizef(pies); // 8 17
OPERATOR: przecinek www.imi.plsl.pl Jeśli bk siebie sti kilka wyrażeń ddzielnych przecinkiem, t: całść jest też wyrażeniem; wartścią całeg wyrażenia jest wartść teg, c jest najbardziej z prawej; np.: wartścią (7+2, a<3.11, b*7, 13+24) jest 37. pnieważ wyrażenia składwe są bliczane d lewej d prawej, t mżna w dalszych wyrażeniach krzystać z wcześniejszych, np.: wartścią (a=6, b=7*a) jest 42. 18
DYNAMICZNY PRZYDZIAŁ PAMIĘCI www.imi.plsl.pl Przydzielanie pamięci: Wszystkie zmienne deklarwane w kdzie prgramu mają statycznie przydzielną pamięć stałym rzmiarze. Zmienne te mieszczą się w bszarze pamięci stałej wielkści zwanym stsem (ang. stack). Skutek np. graniczenie dpuszczalneg rzmiaru tablic. Pzstała część pamięci peracyjnej (tzw. sterta, ang. heap), niewykrzystana przez prgram w mmencie uruchmienia stanwi dstępny zasób pamięciwy. Aplikacje pdczas pracy mgą z nieg krzystać (dynamiczna alkacja pamięci) a następnie zwalniać ją d wspólnej puli. Ważne ilści alkwanej pamięci mżna decydwać w trakcie działania prgramu, np. na pdstawie wpisywanych przez użytkwnika danych. 19
DYNAMICZNY PRZYDZIAŁ PAMIĘCI www.imi.plsl.pl Operatry new / new[] raz delete / delete[] Operatry new raz new[] służą d twrzenia biektów krzystając z dstępneg zapasu pamięci (sterta). Operatry delete raz delete[] służą d zwalniania pamięci przydzielnej dpwiedni peratrami new raz new[]. Mgą być wykrzystane dla dwlneg typu danych, tj. wbudwaneg lub zdefiniwaneg przez użytkwnika. 20
DYNAMICZNY PRZYDZIAŁ PAMIĘCI www.imi.plsl.pl Operatry new / new[] raz delete / delete[] Dstęp d tak utwrznych zmiennych (biektów) umżliwiają wskaźniki. Np.: stwrzenie zmiennej dynamicznej typu duble: alb: duble *abc; abc=new duble; duble *abc=new duble; i jej usunięcie: delete abc; 21
DYNAMICZNY PRZYDZIAŁ PAMIĘCI www.imi.plsl.pl Cechy biektów stwrznych peratrami new i new[]: Obiekty istnieją d mmentu ich utwrzenia peratrem new / new[]d mmentu skaswania peratrem delete/delete[]. Obiekty takie nie mają nazwy; mżna nimi perwać tylk za pmcą wskaźników. Obiektów tych nie bwiązują zwykłe zasady zakresie ważnści, czyli t, w których miejscach prgramu są widzialne lub nie. jeśli w danym mmencie jest dstępny jakiklwiek wskaźnik pkazujący na taki biekt, t biekt ten jest dstępny; jeśli z jakiegś pwdu nie ma żadneg wskaźnika pkazująceg na taki biekt, t nie ma mżliwści usunięcia takieg biektu! 22
DYNAMICZNY PRZYDZIAŁ PAMIĘCI www.imi.plsl.pl Cechy biektów stwrznych peratrami new i new[]: W biektach takich zaraz p ich utwrzeniu tkwią przypadkwe wartści, należy zatem zadbać ich zapisanie w nich senswnych wartści, np. pprzez inicjalizację: duble *abc; abc=new duble(31.45); lub jednlinijkw : duble *abc=new duble(31.45); P zwlnieniu pamięci peratrem delete lub delete[] wart ustawić wskaźnik na 0, c zabezpiecza przed przypadkwym pnwnym usunięciem biektu : Kiedy mże się t stać? Np. gdy istnieją 2 wskaźniki pkazujące na ten sam biekt? Plecam pwieść pstnym Jasiu i balnikach : J. Grębsz, Symfnia C++ standard, t. 1, str. 268-269. 23
DYNAMICZNY PRZYDZIAŁ PAMIĘCI www.imi.plsl.pl Przykład: 24
DYNAMICZNY PRZYDZIAŁ PAMIĘCI www.imi.plsl.pl Przykład (t sam krócej): Pamiętaj: Zawsze zwalniaj zaalkwaną przez siebie pamięć! Niezwlnienie pamięci peracyjnej pwduje tzw. wyciek pamięci (ang. memry leak) - zaalkwana, a niezwlnina pamięć nie jest dstępna dla innych aplikacji. 25