Funkce v C++
V této kapitole se budeme věnovat odlišnostem, které využijeme při navrhování funkcí v C++ a které nám jazyk C nenabízí.
Imlicitní hodnoty parametrů funkcí
Použitím implicitní hodnoty parametru můžeme definovat tzv. výchozí hodnotu parametru. Využijeme to v případě, když víme, že daný parametr budeme ve funkci často používat s nějakou určenou hodnotou. V případě volání funkce daný parametr vynecháme, tím se použijeme se svou implicitní hodnotou.
// použití implicitní hodnoty ve funkci pro parametr z
float soucet (float x, float y, float z=0){
return (x + y + z);
}
// volání funkce
float cislo1 = 3, cislo2 = 5, cislo3 = 8, s1, s2;
// pošlu hodnoty pro všechny 3 parametry
s1 = soucet(cislo1, cislo2, cislo3) ;
// když neuvedu hodnotu pro 3.parametr, použije se implicitně nastavená 0
s2 = soucet(cislo1, cislo2);
Implicitní hodnotu můžeme nastavit i pro více parametrů ve funkci. Platí vždy, že parametry s implicitní hodnotou jsou vždy napravo od těch, které implicitní hodnotu nemají. Implicitní nastavení parametrů nám umožňuje vytvářet flexibilní funkce bez nutnosti použití přetížení.
Přetěžování funkcí
Přetížení funkcí je nový prvek jazyka C++, tuto vlastnost jazyk C neměl. Jde o možnost definovat více funkcí se stejným jménem. Funkce ale musí být navzájem odlišitelné. Aby překladač mohl jednoznačně určit, kterou funkci použít, vyžaduje odlišnosti v počtu nebo v typech parametrů.
Můžeme například deklarovat tři různé funkce pro určení maximální hodnoty:
// verze funkce max pro typ int int max (int a, int b); // verze funkce max pro typ double double max (double a, double b); // maximum ze tří hodnot double max (double a, double b, double c); // maximum pro strukturu Zlomek Zlomek max (Zlomek a, Zlomek b);
Stejný princip můžeme použít u metod ve třídě, často se používá např. přetížení konstruktoru (definice více konstruktorů), které se liší v počtu parametrů.
Použití reference jako parametru funkcí
Jazyk C++ nabízí kromě klasických statických proměnných a ukazatelů možnost použití reference. Reference na daný datový typ je vlastně odkaz (alias) na existující proměnnou. Reference lze výhodně použít jako parametr funkce. V tom případě nám reference umožní vrátit změněnou hodnotu určené proměnné (podobně funguje ukazatel). Referenční parametr se deklaruje pomocí &. V těle funkce se s referencí pracuje jako s běžnou proměnnou.
Použití referencí si ukážeme na příkladu funkce pro záměnu hodnot dvou proměnných. Do funkce předáváme 2 hodnoty. Hodnoty, které vstupují do funkce potřebujeme zároveň vrátit z funkce změněné. Použijeme proto referenci. Podobný příklad jsme řešili v jazyce C pomocí ukazatelů.
//definice funkce
void zamena (float &x, float &y){ //funkce zamění hodnoty 2 čísel
float temp;
temp = x;
x = y;
y = temp;
}
//volání funkce
float a = 5, b = 12;
zamena(a, b);
Reference zvyšuje časovou a paměťovou efektivitu funkcí. Pokud chceme využít výhodu výkonu (při referenci odpadá kopírovaní), ale nechceme, aby funkce původní data změnila, používáme const &. Tento způsob se často používá pro předávání řetězců, vektorů a tříd.