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ė#

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

return_type

Duomenų tipas, kurį grąžina funkcija. Kai kurios dažniausios parinktys:

  • void — Nieko negrąžina
  • int — Grąžina sveikąjį skaičių
  • double — Grąžina slankiojo kablelio skaičių
  • bool — Grąžina true arba false
  • char — Grąžina vieną simbolį
  • const char* — Grąžina teksto eilutę
  • vartotojo apibrėžti tipai — Grąžina struct arba klasės objektą

function_name

Funkcijos pavadinimas.

parameters

Pasirinktinai. Kableliais atskirtas tipizuotų parametrų sąrašas, parašytas kaip type name, kur type nurodo parametro duomenų tipą, o name yra identifikatorius, naudojamas norint pasiekti tą reikšmę funkcijos viduje. Parametrai gauna įvesties reikšmes, kai iškviečiama funkcija.

result

Pasirinktinai. Funkcijos grąžinama reikšmė. Jei funkcijos return_type nėra void void, ši reikšmė turi būti pateikta, o jos tipas turi tiksliai atitikti nurodytą return_type.

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);
}