Funkce#
Zavedení#
Funkce jsou základní součástí programování v C++, balí úryvky kódu do opakovaně použitelných a efektivních částí kódu určených k provádění konkrétního úkolu. Funkce lze v programu volat vícekrát, což usnadňuje organizaci kódu a pomáhá vyhnout se opakování kódu. Funkce také usnadňují ladění kódu.
Tato stránka se zabývá základy používání funkcí v jazyce C++, včetně:
Struktura a syntaxe funkcí — Jak se funkce zapisují v C++, včetně návratových typů, názvů a parametrů.
Prototypy funkcí — Co jsou prototypové funkce a proč se používají.
Definice a volání funkcí — Jak vytvářet funkce a volat je z programu.
Návratové hodnoty — Jak mohou funkce odesílat data zpět volajícímu.
Předávání odkazem — Jak mohou funkce modifikovat proměnné mimo svůj vlastní rozsah platnosti.
Funkce zpětného volání — Jak lze funkce předávat jiným funkcím a volat je automaticky v reakci na události.
Funkce s výchozími argumenty — Jak lze parametrům přiřadit výchozí hodnoty, pokud není zadán žádný argument.
Struktura a syntaxe funkcí#
V C++ musí být funkce deklarovány s jejich návratovým typem, názvem a parametry. Základní syntaxe je:
return_type function_name(parameters) {
// Code to execute when the function is called
return result; // Optional, used to return a value
}
Funkční části |
Popis |
|---|---|
|
Datový typ, který funkce vrací. Mezi běžné možnosti patří:
|
|
Název funkce. |
|
Volitelné. Seznam typovaných parametrů oddělených čárkami, zapsaný jako |
|
Volitelné. Hodnota vrácená funkcí. Pokud |
Poznámka: Funkce musí být vždy deklarována před svým voláním*, nebo musíte poskytnout prototyp funkce.
Funkční prototypy#
V C++ se kód čte shora dolů. To znamená, že funkce musí být kompilátoru známa, než ji lze zavolat.
Prototyp funkce vám umožňuje použít funkci před napsáním jejího plného kódu. To vám umožňuje ponechat main() blízko začátku programu, zatímco definice funkcí umístíte později, kde se snáze uspořádají a čtou.
Bez prototypu byste museli definovat každou funkci nad main(), což může ztěžovat sledování projektů s jejich růstem.
// The function's prototype
void greeting();
int main() {
greeting();
}
// Write the function's body after
void greeting() {
Brain.Screen.print("Hello!");
}
Definování a volání funkcí#
Functions with No Parameters#
Pokud funkce nevyžaduje vstup, můžete ji definovat bez parametrů. Pokud funkce nevrací hodnotu, použijte jako návratový typ void.
// Define a function to display a message
void greeting() {
Brain.Screen.print("Hello!");
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Call the function to display the message
greeting();
}
Functions with Parameters#
Funkcem můžete také přidat parametry, které vám umožní předat informace, které má funkce použít.
Poznámka: Text lze předávat pomocí řetězců ve stylu C (const char*) nebo řetězců C++ (std::string).
// Define a function with a parameter
void namedGreeting(const char* name) {
Brain.Screen.print("Hello, %s!", name);
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
namedGreeting("Stranger");
}
Návratové hodnoty#
Funkce mohou odesílat data zpět volajícímu pomocí klíčového slova return To vám umožňuje zachytit a použít výstup ve vašem projektu.
// Define a function that multiplies numbers by 2
int timesTwo(int number) {
return number * 2;
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Display the return value
Brain.Screen.print("%d", timesTwo(2));
}
Předávání odkazem#
Ve výchozím nastavení C++ předává parametry funkcí podle hodnoty, což znamená, že funkce obdrží kopii původní proměnné. Změny provedené uvnitř funkce neovlivní původní hodnotu.
// Add 1 to the number
void addOne(int number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will still be 5
}
Aby funkce mohla modifikovat původní proměnnou variable, lze parametry předávat odkazem pomocí symbolů &.
// Add 1 to the number
void addOne(int& number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will now be 6
}
Předávání odkazem umožňuje funkcím aktualizovat variables definované mimo funkci bez vrácení hodnoty.
Funkce zpětného volání#
Funkce zpětného volání je funkce, která je předávána jiné funkci a volána automaticky, když dojde k určité události.
Zpětná volání se běžně používají pro události, jako jsou stisknutí tlačítek nebo aktualizace senzorů.
Místo vlastního volání funkce ji projekt zavolá za vás, když k události dojde.
void onPressed() {
Brain.Screen.print("Screen pressed!");
}
// Call onPressed whenever the screen is pressed
int main() {
vexcodeInit();
Brain.Screen.pressed(onPressed);
}
Callback Signatures#
Každá callback funkce musí mít specifickou signaturu, která definuje:
Návratový typ
Počet parametrů
Typy parametrů
Požadovaný podpis je určen rozhraním API. Funkce zpětného volání se musí tomuto podpisu přesně shodovat.
// This callback function cannot include any parameters
void callback(void);
// This callback function includes four parameters
void callback(axisType axis, double x, double y, double z);
Názvy parametrů jsou popisné a mohou se lišit, ale návratový typ, pořadí parametrů a typy parametrů se musí přesně shodovat.
Funkce s výchozími argumenty#
Funkce mohou definovat výchozí hodnoty pro jeden nebo více parametrů. Výchozí argument se použije, když pro daný parametr není při volání funkce zadána žádná hodnota.
Pravidla pro výchozí argumenty:
Výchozí argumenty musí být posledními parametry v definici funkce.
Jakmile má parametr výchozí hodnotu, musí mít všechny parametry za ním také výchozí hodnoty.
Pokud funkce ve svém prototype specifikuje výchozí argumenty, nesmí být tyto výchozí hodnoty znovu specifikovány v definici funkce.
// Required parameter first, default parameter last
void greeting(const char* name, int repeatCount = 1) {
for (int i = 0; i < repeatCount; i++) {
Brain.Screen.print("Hello, %s!", name);
Brain.Screen.newLine();
}
}
int main() {
vexcodeInit();
// Say what name to greet (V5) and
// use default value for repeatCount (1)
greeting("V5");
Brain.Screen.newLine();
// Overrides the default value to 3
greeting("V5", 3);
}