1. Wprowadzenie do programowania wyklad 6
Agata Pólrola
Wydzial Matematyki UL
2005/2006
http://www.math.uni.lodz.pl/~polrola
2. Przeciazenie (przeladowanie) nazwy funkcji Przeladowanie (przeciazenie) nazwy funkcji polega na tym, ze w danym zakresie waznosci (np. pliku) jest wiecej niz jedna funkcja o takiej samej nazwie.
To, która z tych funkcji zostanie w danym przypadku uaktywniona, zalezy od liczby i typu argumentów dla których jest ona wywolywana
przyklady – prog59-przeciazania.cpp prog510-przeciazania_tylko_typ.cpp
3. Funkcje o takich samych nazwach MUSZA róznic sie liczba lub typem argumentów (inaczej kompilator zwróci blad).
dopuszczalna jest tez sytuacja, gdy dwie funkcje maja argumenty tego samego typu, ale w róznej kolejnosci: int wypisz (char z, int k); int wypisz (int k, char zz);
Przy rozróznianiu funkcji typ zwracanej wartosci nie jest brany pod uwage
4. przeladowanie „od srodka”:
dla kompilatora przeladowane funkcje maja RÓZNE nazwy – kompilator pamieta nazwy funkcji wraz z typami argumentów, np.
void fkcja (void); to fkcja__Fv
void fkcja(int,double); to fkcja__Fid
void fkcja(double, int); to fkcja__Fdi
itd
5. Zmienne globalne i lokalnejeszcze raz Mozemy zdefiniowac pewne zmienne, które beda widoczne we wszystkich funkcjach danego programu – sa to tzw zmienne globalne
Wewnatrz funkcji mozna definiowac zmienne, które sa zmiennymi lokalnymi tej funkcji
6. Nazwa zadeklarowana na zewnatrz wszystkich funkcji ma zasieg globalny, czyli jest dostepna wewnatrz wszystkich funkcji umieszczonych w danym pliku
... przy czym jest widziana dopiero ponizej linii w której zostala zadeklarowana
Nazwa (obiekt) lokalny danej funkcji jest widoczna tylko w tej funkcji w której zostala zadeklarowana
... równiez ponizej linii w której zostala zadeklarowana
Nie mozna zatem w jednej funkcji odwolac sie do zmiennej lokalnej innej funkcji...
... a dwie funkcje moga miec zmienne lokalne o takich samych nazwach
7. Jesli w obrebie funkcji definiujemy jakies zmienne, to sa one zazwyczaj pamietane na tzw. stosie (czyli w obszarze „podrecznym”). Sa to tzw. zmienne automatyczne
zmienne globalne (i zmienne z przestrzeni nazw) sa pamietane w „normalnym” obszarze pamieci
„Normalny” obszar pamieci przed uruchomieniem programu jest zerowany. Niezainicjalizowana zmienna globalna ma zatem na poczatku wartosc 0 (odpowiednia dla danego typu)
Zmienne automatyczne nie sa zerowane przy „powolywaniu do zycia”. Maja wartosc losowa
8. Po zakonczeniu bloku, w którym zostala powolana do zycia zmienna automatyczna, przestaje ona istniec.
dokladny moment likwidacji danego obiektu zalezy od kompilatora, ale w kazdym razie nie mozna liczyc, ze po zakonczeniu bloku zmienna istnieje
Przy ponownym wejsciu do danego bloku – np. ponownym wywolaniu tej samej funkcji – zmienna jest powolana do zycia po raz kolejny
oczywiscie przerwanie wykonywania jednej funkcji przez wywolanie innej nie powoduje zlikwidowania zmiennych pierwszej funkcji znajdujacych sie na stosie
9. Obiekty lokalne statyczne Jesli chcielibysmy, aby zmienna lokalna dla danej funkcji nie „ginela”, tylko przy ponownym wejsciu do tej funkcji miala te sama wartosc jak przy ostatnim opuszczeniu tej funkcji, to musimy ja zdefiniowac jako statyczna
deklaracja zmiennej statycznej rózni sie od deklaracji zmiennej „normalnej” tylko slowem static na poczatku: static typ_zmiennej nazwa;
obiekty statyczne sa przechowywane w „normalnej” pamieci
przyklad: prog514-zliczanie_wywolan.cpp
10. Funkcje rekurencyjne Funkcja moze wywolywac sama siebie. Jest to tzw. rekurencja (rekursja).
Moze to robic kazda funkcja, tyle ze jesli nie ma w niej warunku zatrzymujacego rekurencje, to funkcja bedzie sie wywolywala sie w nieskonczonosc, tzn. az do wyczerpania pamieci
przyklad – prog511-silnia_rek.cpp
11. Funkcja rekurencyjna - zmienne Gdy funkcja rekurencyjna wywoluje sama siebie, na stosie sa juz zmienne automatyczne bedace wlasnoscia pierwszego wywolania tej funkcji. Kolejne jej wywolanie umieszcza na stosie swoje wlasne zmienne automatyczne
Zmienne zadeklarowane jako statyczne nie tylko nie gina po zakonczeniu wywolania funkcji, ale sa równiez wspólne dla wszystkich rekurencyjnych wywolan tej funkcji.
przyklad – prog512-sumator_rek.cpp
12. Instrukcja typedef Instrukcja typedef jezyka C++ umozliwia nadanie innej nazwy pewnemu juz istniejacemu typowi: typedef int ocena; ocena s;
Dzieki temu mozemy w programie latwo zmienic typ sluzacy do reprezentowanie ocen, jesli zachodzi taka potrzeba
przyklad – prog60-typedef.cpp
13. Rekordy i struktury Jesli potrzebujemy zlozonego typu danych „laczacego w jedna calosc” elementy róznych typów, to:
w Pascalu i Adzie mozemy zdefiniowac odpowiedni typ rekordowy
przyklad – prog61-osoba.adb
w C++ mozemy uzyc tzw. struktury
14. strukture mozemy zdefiniowac nastepujaco:struct nazwa_struktury{ deklaracje elementów};
przyklady: prog61-osoba.cpp prog62-struktura.cpp prog63-punkty.cpp
tak naprawde w C++ struktury istnieja glównie dla zgodnosci z C – lepiej uzywac klas – ale na razie mozemy z nich korzystac
15. Ciagi znaków (lancuchy) Standardowo do reprezentacji napisu uzywa sie tablicy znaków
Tablica zawiera napis oraz znak konca napisu
Mozna uzywac funkcji gets() i puts() do pobierania/wypisywania napisów
przyklad: prog64-zdania.cpp
wygodniejszym sposobem jest korzystanie z klasy string (przyklad – prog65-strings.cpp)