3) C++ funkce Flashcards
pojem funkce
Funkce je vlastně podprogram, který přijímá nějaké parametry (argumenty) a většinou také vrací nějakou hodnotu. Je to blok příkazů, který je nejdříve definován a poté může být volán. Využívá se v komplexnějších programech, kdy se dlouhý kód „rozbije“ na menší podprogramy. S funkcemi se stává kód přehlednější a efektivnější. Když program narazí v kódu na volání funkce, přeskočí na její tělo (v definici funkce) a vykoná jeho příkazy. Poté příkazem return vrátí určitou hodnotu a program se vrátí zpět na řádek následující po volání funkce. S funkcí poté můžeme pracovat např. jako s výrazem (má nějakou hodnotu).
Každý program v C++ musí obsahovat alespoň jednu funkci – tou je vždy funkce main(). Z funkce main poté můžeme volat další funkce a z nich opět další. Každá funkce se skládá z klíčového slova určujícího typ vrácené hodnoty funkce (int, double…), z názvu funkce (identifikátoru) a seznamu přijatých parametrů uzavřených v kulatých závorkách. Každý parametr může být jiného typu. Každá funkce musí být před použitím deklarována (musí být napsán její tzv. prototyp) a poté definována. Prototyp funkce obvykle uvádíme ještě před funkcí main; na konci těla každé funkce (kromě funkcí typu void, kdy nevrací žádnou hodnotu) uvádíme příkaz return, za nějž uvedeme hodnotu, kterou bude funkce vracet. Poté například když přiřadíme funkci do proměnné:
definice funkce
Definice funkce obsahuje opět seznam parametrů uzavřený v kulatých závorkách a tělo (blok příkazů), které se při volání funkce provede.
Parametry musí být ve stejném pořadí a stejného typu jako v deklaraci. \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ typ_vracene_hondoty nazev(typ parametr1, typ parametrN) { prikazy; return výraz; } \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
umístění definice funkce, hlavičkové soubory
Jsou to soubory, obvykle s příponou .h, které obsahují předdefinované funkce, objekty atp…
Používání vlastních hlavičkových souborů opět oceníme v komplexnějších programech, ve kterých používáme např. mnoho funkcí, tříd, atp. Do programu je vkládáme direktivou #include; princip je takový, že obsah hlavičkového souboru je jakoby vložen do našeho programu místo #include “stdafx.h”.
volání funkce
Volání funkce:
```csharp
nazev(argument1,argument2,argumentN);
~~~
např.:
```csharp
int a=2,b=3,c=4;
cout «_space;spoctiObjem(a,b,c);
int objem = spoctiObjem(a,b,c);
~~~
Volat funkci můžeme až po její deklaraci. Při volání funkce předáváme funkci určité parametry, se kterými funkce pracuje jako s lokálními proměnnými.
lokální a globální proměnné
Lokální a globální proměnné
Ve funkcích si můžeme vytvářet proměnné. Tyto proměnné budou lokální, to znamená, že budou existovat pouze uvnitř funkce, nemůžeme s nimi manipulovat odjinud než z funkce, ve které byly vytvořeny. Po skončení funkce nejsou dále dostupné. S argumenty, které předáváme funkci, poté pracujeme pod názvy parametrů v definici funkce a jako s lokálními proměnnými. Lokální proměnné nemusí být přístupné z celé funkce, můžeme například vytvořit proměnnou v bloku uvnitř funkce a ta bude přístupna pouze z tohoto bloku. Takže tedy: lokální proměnné jsou přístupné pouze z bloku, ve kterém byly deklarovány (vytvořeny):
Globální proměnné jsou proměnné, které jsou deklarovány v prostoru mimo jakoukoliv funkci; můžeme k nim přistupovat ze všech funkcí. Pokud máme v nějaké funkci lokální proměnnou se stejným názvem, jako má už nějaká existující globální proměnná, je v oné funkci globální proměnná “skryta” a pracuje se s proměnnou lokální. Globální proměnné v C++ raději nepoužíváme, protože k nim může přistupovat jakákoliv funkce, což může být v komplexnějších programech velmi nepřehledné a nebezpečné.
typy parametrů funkcí
Reference jako parametr funkce
Potřebujeme, aby nějaká funkce pracovala s již vytvořenými daty, předanými parametry a ne pouze s jejich kopiemi. Můžeme k jejich předání použít referenci. Uvažujme například funkci, která má za úkol prohodit dvě hodnoty typu double.
Předávání parametrů referencí má ještě jednu, mnohdy velkou výhodu. Tento parametr se totiž nemusí kopírovat do nově vytvořené proměnné či objektu, ale funkci pouze řekne, kam k němu má přistupovat. U obyčejných proměnných na tom běžně nezáleží, co když ale budeme mít objekt třídy zabírající v paměti několik kilobytů.
Přetěžování funkcí
C++ je dovoleno vytvořit více funkcí se stejným názvem. Tyto funkce však musí mít rozdílný počet nebo typy parametrů. Typ vrácené hodnoty může být stejný.
Přetěžování funkcí nazýváme polymorfizmus. S polymorfizmem můžete deklarovat více funkcí stejného názvu, správná z nich bude volána na základě argumentů, které jsou jí předány.
Pod pojmem přetěžování si většina lidí představí něco, co by se nemělo provádět, že to zřejmě škodí programu, ale to není pravda – přetěžování funkcí je běžná programovací technika. Využívá se jí zejména při vytváření funkcí provádějících stejnou činnost, ale s různými typy čísel: