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 kodo tvarkymas tampa lengvesnis ir išvengiama 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.
// The function's prototype
void greeting();
int main() {
greeting();
}
// Write the function's body after
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.
// 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#
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).
// 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");
}
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.
// 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));
}
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.
// Add 1 to the number
void addOne(int number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will still be 5
}
Kad funkcija galėtų modifikuoti originalų kintamąjį, parametrus galima perduoti nuoroda naudojant simbolius &.
// Add 1 to the number
void addOne(int& number) {
number++;
}
int main() {
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.
void onPressed() {
Brain.Screen.print("Screen pressed!");
}
// Call onPressed whenever the screen is pressed
int main() {
vexcodeInit();
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.
// 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);
}