Konstantní reference

Reference se hodí i tehdy, když funkce vektor vůbec nemění. Při předání hodnotou se totiž zkopíruje celý vektor se všemi prvky. U vektoru s pěti čísly to nevadí, ale u vektoru s milionem měření by program kopíroval milion čísel při každém volání funkce. Reference se nekopíruje, a tak je předání rychlé, ať je vektor jakkoli velký.

Obyčejná reference má ale nevýhodu: funkce by vektor mohla změnit, třeba omylem. A kdo čte int soucet(std::vector<int>& cisla), myslí si, že funkce vektor mění. Proto se před typ přidává slovo const.

const (z anglického constant, stálý) znamená, že se hodnota nesmí měnit. Můžete ho použít i u obyčejné proměnné, jejíž hodnota se v programu nemá nikdy změnit:

#include <iostream>

int main() {
    const int pocetKol = 3;
    pocetKol = 4;
    return 0;
}

Tento program se nepřeloží:

main.cpp:5:14: error: cannot assign to variable 'pocetKol' with const-qualified type 'const int'

Překladač hlídá, aby do proměnné s const nikdo nic nepřiřadil (cannot assign znamená „nelze přiřadit“).

Konstantní reference spojuje obojí: funkce dostane vektor bez kopírování a nesmí ho změnit:

#include <iostream>
#include <vector>

int soucet(const std::vector<int>& cisla) {
    int celkem = 0;
    for (int cislo : cisla) {
        celkem = celkem + cislo;
    }
    return celkem;
}

int main() {
    std::vector<int> nakupy = {120, 45, 80};
    std::cout << "Celkem: " << soucet(nakupy) << std::endl;
    return 0;
}

Tento kód vypíše:

Celkem: 245

Parametr const std::vector<int>& cisla čtěte jako „cisla je reference na vektor celých čísel, který se nesmí měnit“. Vektor nakupy v main přitom const není: const u parametru platí jen uvnitř funkce. Kdyby se funkce pokusila vektor změnit, třeba příkazem cisla[0] = 0;, překlad skončí chybou cannot assign to return value because function 'operator[]' returns a const value. Pro cisla.push_back(5); je to chyba no matching member function for call to 'push_back'.

Jaký parametr tedy zvolit?

  • Malé hodnoty, které funkce jen čte (int, double, char, bool), předávejte hodnotou: int pocet. Zkopírovat jedno číslo je stejně rychlé jako předat referenci.
  • Vektory a texty, které funkce jen čte, předávejte konstantní referencí: const std::vector<int>& cisla, const std::string& jmeno. Takovou funkci můžete zavolat i s hodnotou, která není v proměnné: funkci void pozdrav(const std::string& jmeno) třeba s textem v uvozovkách, pozdrav("Eva").
  • Co má funkce změnit, předávejte referencí bez const: int& skore, std::vector<int>& body.

Pokyny

Ve vektoru kroky je počet kroků za každý den. Funkce soucet vektor jen čte, a přesto dostává jeho kopii. Změňte její parametr na konstantní referenci. Program dál vypíše Kroků celkem: 38100.

Pod funkci soucet napište funkci nejvice, která také dostane vektor jako konstantní referenci a vrátí jeho největší prvek. V main pod první výpis přidejte výpis textu Nejvíc za den: a výsledku funkce nejvice(kroky). Program vypíše Kroků celkem: 38100 a pod tím Nejvíc za den: 12000.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

4/10