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

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.

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() viduje

int 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 (IQ) and
  // use default value for repeatCount (1)
  greeting("IQ");

  Brain.Screen.newLine();

  // Overrides the default value to 3
  greeting("IQ", 3);
}