Lokální proměnné
Uvnitř funkce můžete vytvářet proměnné stejně jako v main. Taková proměnná ale existuje jen uvnitř funkce: vznikne, když se funkce spustí, a zanikne, když funkce skončí. Mimo funkci ji C++ nezná:
#include <iostream>
#include <string>
void rekniAhoj() {
std::string zprava = "Ahoj!";
std::cout << zprava << std::endl;
}
int main() {
rekniAhoj();
std::cout << zprava << std::endl;
return 0;
}Program se nepřeloží:
main.cpp:11:18: error: use of undeclared identifier 'zprava'
11 | std::cout << zprava << std::endl;
| ^~~~~~
1 error generated.Na řádku 11 se main snaží vypsat proměnnou zprava, která existuje jen uvnitř funkce rekniAhoj. Stejné je to s parametry: existují jen uvnitř své funkce.
Části programu, ve které proměnná existuje, se říká obor platnosti proměnné (anglicky scope). Proměnná vytvořená uvnitř funkce je lokální: patří jen této funkci. To platí i pro main, protože i ta je funkce. Proměnné z main proto ostatní funkce nevidí:
#include <iostream>
#include <string>
void vypisStitek(std::string produkt) {
std::cout << nazevObchodu << ": " << produkt << std::endl;
}
int main() {
std::string nazevObchodu = "Zverimex Packa";
vypisStitek("krmivo pro psy");
return 0;
}Tento program se nepřeloží. Chyba use of undeclared identifier 'nazevObchodu' je na řádku 5, uvnitř funkce, která proměnnou z main nezná. Když funkce potřebuje hodnotu z main, předejte jí ji jako argument: přidejte funkci parametr std::string obchod a zavolejte ji vypisStitek(nazevObchodu, "krmivo pro psy"). (Proměnné vytvořené mimo všechny funkce by viděly všechny funkce, ale v tomto kurzu je nepoužíváme. V delším programu se těžko hlídá, která funkce je změnila.)
Obor platnosti má každý blok ve složených závorkách. Proměnná vytvořená uvnitř if nebo cyklu existuje jen do jeho } a proměnná i z for (int i = 0; ...) existuje jen v cyklu.
Proč je užitečné, že lokální proměnné zůstávají uvnitř svých funkcí?
- Funkce si navzájem nepřekážejí. Dvě funkce mohou mít každá svou proměnnou
celkema jsou to dvě různé proměnné: změna jedné nezmění tu druhou. - Abyste mohli funkci použít, stačí vědět, co jí dát (argumenty) a co vrací (návratovou hodnotu). Jak funguje uvnitř, je její věc.
- Každé volání začíná znovu: proměnné funkce vzniknou nanovo a nic z předchozího volání v nich nezůstane.
Parametr je také lokální proměnná. Při volání se do něj uloží kopie argumentu. Když funkce parametr změní, proměnná v main zůstane stejná:
#include <iostream>
void vynuluj(int skore) {
skore = 0;
}
int main() {
int skore = 10;
vynuluj(skore);
std::cout << skore << std::endl;
return 0;
}Tento program vypíše:
10Funkce nastavila na 0 svůj parametr skore. Proměnná skore v main je ale jiná proměnná, jen se stejným názvem, a zůstala 10.
Pravidlo je tedy jednoduché: hodnoty se do funkce dostávají přes parametry a ven z ní pomocí return. Když potřebujete hodnotu zevnitř funkce, nesahejte po její proměnné. Vraťte hodnotu pomocí return a uložte si ji tam, kde funkci voláte.
Jak psát:
Pokyny
Program se nepřeloží, protože celkem existuje jen uvnitř funkce. Opravte ho: změňte návratový typ funkce na int a vraťte z ní celkem. V main uložte výsledek volání celkovaCena(25, 4) do proměnné ucet a místo celkem vypište ucet. Program vypíše 100.
Ke každé objednávce se platí ještě doprava. Její cena je v proměnné doprava v main. Funkce ji nevidí, protože je lokální v main. Přidejte funkci třetí parametr doprava typu int, uvnitř funkce ho přičtěte k celkové ceně a při volání mu předejte proměnnou doprava: celkovaCena(25, 4, doprava). Program pak vypíše 105.
Začněte programovat zdarma
8/10