Funkcijos#
Įvadas#
Funkcijos yra esminis C++ programavimo komponentas, supakuojantis kodo fragmentus į pakartotinai naudojamas, efektyvias kodo dalis, skirtas atlikti konkrečią užduotį. Funkcijas programoje galima iškviesti kelis kartus, todėl lengviau tvarkyti kodą ir išvengti pasikartojančio kodo. Funkcijos taip pat palengvina kodo derinimą.
Šiame puslapyje aprašomi C++ funkcijų naudojimo pagrindai, įskaitant:
Funkcijos struktūra ir sintaksė — Kaip funkcijos rašomos C++ kalba, įskaitant grąžinimo tipus, pavadinimus ir parametrus.
Funkcijų prototipai – Kas yra prototipų funkcijos ir kodėl jos naudojamos.
Funkcijų apibrėžimas ir iškvietimas — Kaip kurti funkcijas ir jas iškviesti iš savo programos.
Grąžinamos reikšmės – Kaip funkcijos gali siųsti duomenis atgal skambinančiajam.
Perdavimas pagal nuorodą — Kaip funkcijos gali modifikuoti kintamuosius už savo taikymo srities ribų.
Atgalinio iškvietimo funkcijos – Kaip funkcijos gali būti perduodamos kitoms funkcijoms ir automatiškai iškviečiamos reaguojant į įvykius.
Funkcijos su numatytaisiais argumentais — Kaip parametrams galima suteikti numatytąsias reikšmes, kai nepateikiamas joks argumentas.
Funkcijos struktūra ir sintaksė#
C++ kalboje funkcijos turi būti deklaruojamos nurodant jų grąžinimo tipą, pavadinimą ir parametrus. Pagrindinė sintaksė yra:
return_type function_name(parameters) {
// Code to execute when the function is called
return result; // Optional, used to return a value
}
Funkcinės dalys |
Aprašymas |
|---|---|
|
Duomenų tipas, kurį grąžina funkcija. Kai kurios dažniausios parinktys:
|
|
Funkcijos pavadinimas. |
|
Pasirinktinai. Kableliais atskirtas tipizuotų parametrų sąrašas, parašytas kaip |
|
Pasirinktinai. Funkcijos grąžinama reikšmė. Jei funkcijos |
Pastaba: Funkcija visada turi būti deklaruota prieš ją iškviečiant arba turite pateikti funkcijos prototipą.
Funkcijų prototipai#
C++ kalboje kodas skaitomas iš viršaus į apačią. Tai reiškia, kad prieš iškviečiant funkciją, ji turi būti žinoma kompiliatoriui.
Funkcijos prototipas leidžia panaudoti funkciją prieš parašant visą jos kodą. Tai leidžia laikyti main() programos viršuje, o funkcijų apibrėžimus įdėti vėliau, kur juos lengviau tvarkyti ir skaityti.
Be prototipo, turėtumėte apibrėžti kiekvieną funkciją, viršijančią main(), todėl projektams augant gali būti sunkiau sekti.
Apibrėžkite funkcijos prototipą (už
int main())// The function's prototype void greeting();Iškvieskite funkciją
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); greeting(); }Parašykite funkcijos kūną po
void greeting() { Brain.Screen.print("Hello!"); }
Funkcijų apibrėžimas ir iškvietimas#
Functions with No Parameters#
Jei funkcijai nereikia įvesties, galite ją apibrėžti be parametrų. Naudokite void kaip grąžinimo tipą, jei funkcija negrąžina reikšmės.
Apibrėžkite funkciją (už
int main())// Define a function to display a message void greeting() { Brain.Screen.print("Hello!"); }Iškvieskite funkciją
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Call the function to display the message greeting(); }
Functions with Parameters#
Taip pat galite pridėti parametrus prie funkcijų, kurie leidžia perduoti informaciją, kurią funkcija naudos.
Pastaba: Tekstą galima perduoti naudojant C stiliaus eilutes (const char*) arba C++ eilutes (std::string).
Apibrėžkite funkciją (už
int main())// Define a function with a parameter void namedGreeting(const char* name) { Brain.Screen.print("Hello, %s!", name); }Iškvieskite funkciją su parametru, esančiu nulio viduje
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Call the function to display the message namedGreeting("Stranger"); }
Grąžinimo reikšmės#
Funkcijos gali siųsti duomenis atgal skambinančiajam naudodamos raktinį žodį return Tai leidžia užfiksuoti ir naudoti išvestį savo projekte.
Apibrėžkite funkciją (už
int main())// Define a function that multiplies numbers by 2 int timesTwo(int number) { return number * 2; }Iškvieskite funkciją su parametru, esančiu nulio viduje
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Display the return value Brain.Screen.print("%d", timesTwo(2)); }
Praeinant pro nuorodą#
Pagal numatytuosius nustatymus C++ perduoda funkcijos parametrus pagal reikšmę, tai reiškia, kad funkcija gauna originalaus kintamojo kopiją. Funkcijos viduje atlikti pakeitimai neturi įtakos pradinei reikšmei.
Apibrėžkite funkciją (už
int main())// Add 1 to the number void addOne(int number) { number++; }Iškvieskite funkciją su parametru, esančiu nulio viduje
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); int value = 5; addOne(value); // "value" will still be 5 }
Kad funkcija galėtų modifikuoti originalų kintamąjį, parametrus galima perduoti nuoroda naudojant simbolius &.
Apibrėžkite funkciją (už
int main())// Add 1 to the number void addOne(int& number) { number++; }Iškvieskite funkciją su parametru, esančiu nulio viduje
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); int value = 5; addOne(value); // "value" will now be 6 }
Perdavimas nuoroda leidžia funkcijoms atnaujinti už funkcijos ribų apibrėžtus kintamuosius negrąžinant reikšmės.
Atgalinio iškvietimo funkcijos#
Atgalinio iškvietimo funkcija yra funkcija, kuri perduodama kitai funkcijai ir automatiškai iškviečiama, kai įvyksta konkretus įvykis.
Atgaliniai iškvietimai dažniausiai naudojami tokiems įvykiams kaip mygtukų paspaudimai arba jutiklių atnaujinimai.
Užuot iškvietus funkciją pačiam, projektas ją iškviečia už jus, kai įvyksta įvykis.
Apibrėžkite grįžtamojo ryšio funkciją (už
int main())// Create a callback function void onPressed() { Brain.Screen.print("Screen pressed!"); }Registruokite atgalinį iškvietimą
int main()vidujeint main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Call onPressed whenever the screen is pressed Brain.Screen.pressed(onPressed); }
Callback Signatures#
Kiekviena grįžtamojo ryšio funkcija turi sekti konkretų parašą, kuris apibrėžia:
Grąžinimo tipas
Parametrų skaičius
Parametrų tipai
Reikalingą parašą nustato API. Atgalinio iškvietimo funkcija turi tiksliai atitikti šį parašą.
// 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);
Parametrų pavadinimai yra aprašomieji ir gali skirtis, tačiau grąžinimo tipas, parametrų tvarka ir parametrų tipai turi tiksliai sutapti.
Funkcijos su numatytaisiais argumentais#
Funkcijos gali apibrėžti numatytąsias vieno ar kelių parametrų vertes. Numatytasis argumentas naudojamas, kai iškviečiant funkciją tam parametrui nenurodoma jokia vertė.
Numatytųjų argumentų taisyklės:
Numatytieji argumentai turi būti paskutiniai funkcijos apibrėžimo parametrai.
Kai parametras turi numatytąją reikšmę, visi po jo esantys parametrai taip pat turi turėti numatytąsias reikšmes.
Jei funkcija savo prototype nurodo numatytuosius argumentus, šių numatytųjų reikšmių negalima nurodyti dar kartą funkcijos apibrėžime.
Apibrėžkite funkciją (už
int main())// 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(); } }Iškvieskite funkciją
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Say what name to greet (EXP) and // use default value for repeatCount (1) greeting("EXP"); Brain.Screen.newLine(); // Overrides the default value to 3 greeting("EXP", 3); }
// 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 (EXP) and
// use default value for repeatCount (1)
greeting("EXP");
Brain.Screen.newLine();
// Overrides the default value to 3
greeting("EXP", 3);
}