Programování v C++ 1, 14. cvičení výpustka, přetěžování funkcí, šablony funkcí 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019
Přehled 1 2 funkcí 3
minule procvičené látky 1 funkce main hlavička funkce přístup k parametrům příkazového řádku ukončení programu ukončením funkce main funkce exit a abort funkce atexit 2 rekurze přímá a nepřímá rekurze odstranění rekurze Fibonacciho posloupnost Ackermannova funkce
Přehled funkcí 1 2 funkcí 3
Výpustka funkcí umožňuje vytvářet funkce, které lze volat s různým počtem a typem parametrů výpustka (... ) musí být uvedena jako poslední parametr práce s pomocí maker va_start, va_arg, va_end a ukazatele typu va_list hlavičkový soubor <cstdarg> (resp. <stdarg.h>) procházení parametrů pomocí proměnné typu va_list inicializace této proměnné pomocí makra va_start přístup k hodnotě parametru pomocí makra va_arg úklid pomocí makra va_end v jazyce C++ výpustka vytlačována přetěžováním funkcí
Příklad funkcí 1 #include <cstdarg> 2 3 int soucet(int pocet,...){ 4 int s = 0; 5 va_list ap; 6 va_start(ap, pocet); 7 for(int i = 0; i < pocet; i++) 8 s = s + va_arg(ap, int); 9 return s; 10 } 11 12 int main(){ 13 int s = soucet(5, 1, 2, 4, 3, 5); 14...
funkcí v jednom programu může existovat více funkcí se stejným identifikátorem, které se liší type a/nebo počtem parametrů při volání překladač podle počtu a typu skutečných parametrů rozhodne, kterou z funkcí má zavolat 1 void prohod(int &a, int &b){ 2 int c = a; a = b; b = c; 3 } 4 void prohod(float &a, float &b){ 5 float c = a; a = b; b = c; 6 } 7 8 int main(){ 9 int i1, i2; 10 prohod(i1, i2);
Přehled funkcí 1 2 funkcí 3
Funkce maximum funkcí funkce vracející větší ze svých parametrů 1 int maximum(int a, int b){ 2 if(a > b) return a; 3 else return b; 4 } co když potřebujeme počítat s racionálními čísly? 1 double maximum(double a, double b){ 2 if(a > b) return a; 3 else return b; 4 } využili jsme přetěžování funkcí tělo funkcí je stejné, liší se jen typ paramatrů pozn.: nahradit tělo pomocí operátoru?:
funkcí v jazyce C++ zavedeny šablony umožňují popsat množinu funkcí, které se liší jen typem některých parametrů umožňují popsat množinu tříd, které se liší jen typem některých atributů narozdíl od maker zpracovány překladačem představují vzor, podle kterého překladač sestaví funkci/objektový typ specializace šablony deklarace šablony: template<formalni_parametry> deklarace parametry mohou být hodnotové, typové, šablonové deklarace je definiční nebo informativní deklarace funkce, objektového typu, metody objektového typu,...
Přehled funkcí 1 2 funkcí 3
Příklad: šablona funkce funkcí Příkad: šablona maximum 1 template<class T> 2 T maximum(const T &a, const T &b){ 3 if(a > b) return a; 4 else return b; 5 } některé specializace šablony 1 int main(){ 2 int i=5, j=4; double x=3.14, y=2.71; 3 cout << maximum(i, j) << endl; 4 cout << maximum(x, y) << endl; 5 cout << maximum<int>(i, x) << endl; 6 return 0; 7 }
Přetěžování šablon funkcí pro některé typy T nemusí specializace správně fungovat pro tyto typy napsat stejně pojmenovanou volnou funkci 1 #include <cstring> //kvuli strcmp 2 template<class T> T maximum(const T &a, const T &b){ 3 return a > b? a : b; 4 } 5 6 const char* maximum(const char *a, const char *b){ 7 return (strcmp(a, b) > 0? a : b); 8 } 9 10 int main(){ 11 int a = 1, b =2; 12 double x = 1.414, y = 3.1415; 13 const char *s1 = "hello"; 14 const char *s2 = "cau"; 15 cout << maximum(s1, s2) << endl; 16 cout << maximum<int>(a, x) << endl; 17 return 0; 18 }
Procvičené pojmy 1 funkce s proměnným počtem parametrů výpustka 2 přetěžování funkcí 3 šablony šablony funkcí šablony tříd specializace šablon přetěžování šablon