szablony funkcji i klas

Nasza ocena:

4
Pobrań: 7
Wyświetleń: 581
Komentarze: 0
Notatek.pl

Pobierz ten dokument za darmo

Podgląd dokumentu
szablony funkcji i klas - strona 1

Fragment notatki:


Szablony funkcji i klas Wykład 9 05/12/20 2 Szablony W języka programowanie takich jak C++ gdzie  istnieje ścisła kontrola typów często występuję potrzeba wielokrotnego zdefiniowania takiej  samej funkcji, ale pracującej na róŜnych typach  danych Rozwiązaniem jest wykorzystanie makrodefinicji  znanych z języka C Mechaniczne podstawianie, które moŜe stwarzać problemy Nie zalecane!!! Dlatego w języku C++ wprowadzono szablony,  które rozwiązują większość problemów 05/12/20 3 Makrodefinicje Do generowania „funkcji” wykonujących to samo  zadanie na róŜnych typach danych w języku C  moŜna było wykorzystywać makrodefinicje #define max(a, b) (((a)  Typ max(Typ a, Typ b) { return (a  Typ min(Typ a, Typ b) { return (a 

(…)

…++);
PoniewaŜ rozwinięcie max daje rezultat
(((a++) < (b++)) ? (b++) : (a++))
05/12/20
3
Szablony
Szablony reprezentują funkcję, a nawet typy
danych tworzone przez programistów (klasy)
Ale same nie są funkcjami ani klasami
Nie zostają one zaimplementowane dla
określonego typu danych, poniewaŜ zostanie on
zdefiniowany później
W większości sytuacji parametryzowane są typem, ale
nie jest to reguła
Aby uŜyć szablonu kompilator lub programista
musi określić dla jakiego typu ma on zostać uŜyty
05/12/20
4
Definiowanie szablonu funkcji
Do definiowania szablonów uŜywane jest słowo
kluczowe template
template<class Typ> Typ max(Typ a, Typ b)
{ return (a < b) ? b : a; }
Do określania typu w starszej notacji słuŜyło słowo class
template<typename Typ> Typ min(Typ a, Typ b)
{ return (a < b) ? a : b; }
Nowa specyfikacja wprowadza słowo kluczowe typename do
określania typu
W tym przykładzie parametrem szablonu jest Typ, który
moŜe zostać zamieniony na dowolny typ rzeczywisty
(wbudowany lub zdefiniowany przez programistę)
Najczęściej uŜywa się do nazwania typu symbolu T
05/12/20
5
Definiowanie szablonu funkcji…
Szablon musi zostać zdefiniowany w takim miejscu, Ŝeby znalazł
się w zakresie globalnym
Innymi słowy musi być zdefiniowany poza innymi funkcjami lub
klasami, a najlepiej w jakieś przestrzeni nazw
Wszystkie szablony zdefiniowane w standardzie języka znajdują się
w przestrzeni nazw std
Zdefiniowanie szablonu zaoszczędza nam programistom pisania,
ale wcale nie zmniejsza kodu wygenerowanego przez kompilator
Po prostu kompilator generuje funkcje z szablonu dla kaŜdego typu
dla jakiego jest ona potrzebna
Szablony funkcji…
… pochodnych odbywa się w taki
sam sposób jak w normalnych funkcjach
T* a; //wskaźnik do zmiennej typu T
T& a = b; //referencja do zmiennej typu T
T a[10]; //tablica elementów typu T
Przykład – szablon swap(a, b);
05/12/20
12
Szablony funkcji, a przydomki
inline, static, extern
Szablony funkcji moŜna równieŜ wykorzystać do
produkowanie funkcji typu inline, static i extern
NaleŜy pamiętać, Ŝe to funkcja ma być np. inline, a nie
sam szablon
template<typename Typ> inline Typ max(Typ a, Typ
b); //OK
inline template<typename Typ> Typ max(Typ a, Typ
b); //źle
Podobnie jest z przydomkami static i extern
Co znaczy, Ŝe funkcja (zwykła) jest static?
05/12/20
13
Funkcje specjalizowane
Czasami funkcja wygenerowana przez szablon
moŜe być nieodpowiednia
np. max(char*, char*)
Istnieje wtedy moŜliwość zdefiniowanie…
… globalnym (lub
lepiej w jakiejś przestrzeni nazw)
template<typename T> int K<typ>::a;
template<typename T> K<T>* K<typ>::a;
Przykład cpp_9.15
05/12/20
28
Typedef
Instrukcja typedef umoŜliwia tworzenie
synonimów dla znanych typów danych
template<typename T, unsigned short a,
double (*ptr)(double, double) class
K{...};
Deklaracja obiekty takiej klasy moŜe mieć postać
K<std::string, 10, fun> a;
typedef K<std…

Zadeklarowanie przyjaźni róŜnej dla kaŜdej
wersji klasy polega na uzaleŜnieniu tej deklaracji
od parametry szablonu
friend void fun(K<T> obj);
friend class Klasa<T>;
05/12/20
34
KaŜda klasa szablonowa posiada
swojego przyjaciela (funkcję)
Mogą wystąpić problemy jeŜeli szablon
klasy jest uzaleŜniony nie tylko od typu, ale
takŜe np. od stałej, a chcemy mieć funkcję
szablonową inną dla kaŜdej wersji szablonu
klasy…
... zobacz całą notatkę



Komentarze użytkowników (0)

Zaloguj się, aby dodać komentarz