headerphoto

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.