Funkce jsou nezávislé jednotky, které se skládají z deklarace, definice a příkazů. Pomocí funkcí lze rozložit komplexní problém na menší, přehledné dílčí problémy. Rozdělení na tyto nezávislé jednotky umožňuje vyhnout se opakovanému psaní úseků kódu.
[paměťová_třída] typ_návratové_hodnoty jméno_metody ([parametry])[cv-modifikátor] [throw(seznam_výjimek)] { tělo_metody }
paměťová_třída | |||
Nepovinná. Jako paměťovou třídu lze použít klíčová slova extern, static a virtual - určující viditelnost funkce. | |||
typ_návratové_hodnoty | |||
Povinná. Stanoví typ návratové hodnoty z funkce. Funkce smí vracet libolný typ proměnné kromě pole a funkce. Lze obejít použitím ukazatele nebo reference na pole (funkci). | |||
jméno_metody | |||
Povinná. Identifikátor (jméno) deklarované metody. Může být doplněn jménem třídy nebo prostoru jmen. | |||
parametry | |||
Uvedení typu a jména formálních parametrů oddělených čárkami. Parametrům zde mohou být přiřazeny implicitní hodnoty. | |||
cv-modifikátor | |||
Jeden nebo oba z modifikátorů const a volatile. | |||
seznam_výjimek | |||
Seznam výjimek, které se mohou z funkce šířit. | |||
tělo_funkce | |||
Blok příkazů uzavřený do bloku. |
Každá metoda musí vracet návratovou hodnotu typu typ_návratové_hodnoty. Hodnota je z funkce předána pomocí příkazu
return(hodnota);
int maximum (int a, int b) { if (a > b) return(a); else return(b); }
Volání metody v C++ se uskuteční příkazem
proměnná = jméno_metody (argumenty);
Příklad volání metody maximum:
vysledek = maximum (10, 20); // funkce vrátí hodnotu 20
Parametry předávají hodnoty mezi volající a volanou funkcí. Parametry jsou lokální proměnné, jejichž rozsah je blok tvořící tělo volané funkce. V C++ je možné použít dva způsoby předání hodnot funkci:
Při předání skutečného parametru hodnotou se do lokální proměnné volané funkce okopíruje hodnota předávaného skutečného parametru. To zajistí, že volaná funkce nezmění proměnnou, kterou předáváme jako skutečný parametr.
Příklad předání hodnot funkci hodnotou
#include <stdio.h> void tisk(int param) { printf("\tParametr po vstupu do funkce má hodnotu: %d\n", param); param = param+param; printf("\tParametr po výpočtu má hodnotu: %d\n", param); } void main() { int cislo = 50; printf("Parametr před vstupem do funkce má hodnotu: %d\n", cislo); tisk(cislo); printf("Parametr po opustění funkce má hodnotu: %d\n", cislo); }
Po spuštění programu se objeví následující výpis:
Parametr před vstupem do funkce má hodnotu: 50 Parametr po vstupu do funkce má hodnotu: 50 Parametr po výpočtu má hodnotu: 100 Parametr po opustění funkce má hodnotu: 50
Při předání skutečného parametru odkazem se do lokální proměnné volané funkce okopíruje adresa předávaného skutečného parametru (funkci předáme ukazatel na skutečnou proměnnou). To zajistí, že volaná funkce může měnit proměnnou, kterou předáváme jako skutečný parametr.
Příklad předání hodnot funkci hodnotou
#include <stdio.h> void tisk(int *param) { printf("\tParametr po vstupu do funkce má hodnotu: %d\n", param); param = param+param; printf("\tParametr po výpočtu má hodnotu: %d\n", param); } void main() { int cislo = 50; printf("Parametr před vstupem do funkce má hodnotu: %d\n", cislo); tisk(&cislo); // předáváme adresu na proměnnou printf("Parametr po opustění funkce má hodnotu: %d\n", cislo); }
Po spuštění programu se objeví následující výpis:
Parametr před vstupem do funkce má hodnotu: 50 Parametr po vstupu do funkce má hodnotu: 50 Parametr po výpočtu má hodnotu: 100 Parametr po opustění funkce má hodnotu: 100
Někdy potřebujeme předat hodnotu odkazem (např. pole), ale funkce nesmí změnit hodnoty jednotlivých prvků. Pro tento účel použijeme následující volání funkce:
typ jméno_funkce(const typ_parametru *jméno:proměnné, další_parametry, ....);
Modifikátor const zajistí, že nedojde ke změně hodnot v proměnné, která byla předaná odkzem.
Programovací jazyk C++ dovoluje definici více funkcí stejného jména lišící se počtem nebo typem parametrů. Přetížené funkce se rozlišují již v době překladu programu. Překladač si doplní identifikátor funkce znakovým řetězcem obsahujícím informace o počtu a typech parametrů. Interně poté pracuje s jednoznačnými jmény.
Přetěžování funkcí se zavádí, implementujeme-li například více verzí algoritmu ... . Umožňuje nám to nezavádět více identifikátorů pro různé varianty téže funkce.
Naopak lze rozlšit typ T* od const T*.
Rozsah platnosti metody, definuje oblast programu, ve které je metoda přístupná (je ji možné volat). Jakmile vytvoříme v C++ metodu, je tato metoda přístupná pouze ve třídě, v níž byla metoda definována. To znamená, že program nemůže volat metody z jiné třídy.
Rozsah platnosti funkcí je možné měnit (určovat) pomocí modifikátorů: