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: 245Parametr 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é: funkcivoid 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.
Jak psát:
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
4/10