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 celkem a 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:

10

Funkce 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.

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

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

8/10