Funkcijas#

Ievads#

Funkcijas ir C++ programmēšanas pamatkomponente, kas koda fragmentus iepako atkārtoti izmantojamās, efektīvās koda sadaļās, kas paredzētas konkrēta uzdevuma veikšanai. Funkcijas programmas ietvaros var izsaukt vairākas reizes, tādējādi atvieglojot koda organizēšanu un palīdzot izvairīties no atkārtota koda. Funkcijas arī atvieglo koda atkļūdošanu.

Šajā lapā ir aplūkoti C++ funkciju lietošanas pamati, tostarp:

Funkcijas struktūra un sintakse#

C++ valodā funkcijas ir jādeklarē ar to atgriešanas tipu, nosaukumu un parametriem. Pamata sintakse ir šāda:

return_type function_name(parameters) {
  // Code to execute when the function is called
  return result;  // Optional, used to return a value
}

Funkciju daļas

Apraksts

return_type

Funkcijas atgriežamais datu tips. Dažas izplatītākās opcijas ir:

  • void — Neko neatgriež
  • int — Atgriež veselu skaitli
  • double — Atgriež peldošā komata skaitli
  • bool — Atgriež true vai false
  • char — Atgriež vienu rakstzīmi
  • const char* — Atgriež teksta virkni
  • lietotāja definēti tipi — Atgriež struct vai klases objektu

function_name

Funkcijas nosaukums.

parameters

Neobligāti. Ar komatiem atdalīts tipizētu parametru saraksts, kas rakstīts kā type name, kur type norāda parametra datu tipu un name ir identifikators, ko izmanto, lai piekļūtu šai vērtībai funkcijas ietvaros. Parametri saņem ievades vērtības, kad funkcija tiek izsaukta.

result

Neobligāti. Funkcijas atgrieztā vērtība. Ja funkcijas return_type nav void voidun tās tipam ir precīzi jāatbilst norādītajam return_type.

Note: A function must always be declared before it is called, or you must provide a function prototype.

Funkciju prototipi#

C++ valodā kods tiek lasīts no augšas uz leju. Tas nozīmē, ka funkcijai ir jābūt zināmai kompilatoram, pirms to var izsaukt.

Funkcijas prototips ļauj izmantot funkciju pirms tās pilna koda rakstīšanas. Tas ļauj saglabāt main() programmas augšdaļā, vienlaikus ievietojot funkciju definīcijas vēlāk, kur tās ir vieglāk sakārtot un lasīt.

Bez prototipa jums būtu jādefinē katra funkcija virs main(), kas var apgrūtināt projektu izsekošanu, tiem augot.

// The function's prototype
void greeting();

int main() {
  greeting();
}

// Write the function's body after
void greeting() {
  Brain.Screen.print("Hello!");
}

Funkciju definēšana un izsaukšana#

Functions with No Parameters#

Ja funkcijai nav nepieciešama ievade, to var definēt bez parametriem. Izmantojiet void kā atgriešanas tipu, ja funkcija neatgriež vērtību.

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

Funkcijām var pievienot arī parametrus, kas ļauj nodot informāciju, ko funkcija izmanto.

Piezīme: Tekstu var nodot, izmantojot C stila virknes (const char*) vai C++ virknes (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");
}

Atgriešanas vērtības#

Funkcijas var nosūtīt datus atpakaļ izsaucējam, izmantojot atslēgvārdu return Tas ļauj tvert un izmantot izvadi savā projektā.

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

Garāmejot atsaucei#

Pēc noklusējuma C++ nodod funkcijas parametrus pēc vērtības, kas nozīmē, ka funkcija saņem sākotnējā mainīgā kopiju. Funkcijas iekšpusē veiktās izmaiņas neietekmē sākotnējo vērtību.

// Add 1 to the number
void addOne(int number) {
  number++;
}

int main() {
  int value = 5;
  addOne(value);
  // "value" will still be 5
}

Lai funkcija varētu modificēt sākotnējo mainīgo, parametrus var nodot ar atsauci, izmantojot simbolu &.

// Add 1 to the number
void addOne(int& number) {
  number++;
}

int main() {
  int value = 5;
  addOne(value);
  // "value" will now be 6
}

Pāreja pēc atsauces ļauj funkcijām atjaunināt ārpus funkcijas definētos mainīgos, neatgriežot vērtību.

Atzvanīšanas funkcijas#

Atzvanīšanas funkcija ir funkcija, kas tiek nodota citai funkcijai un tiek automātiski izsaukta, kad notiek konkrēts notikums.

Atzvanīšanas parasti tiek izmantotas tādiem notikumiem kā pogu nospiešana vai sensoru atjaunināšana.

Tā vietā, lai funkciju izsauktu pats, projekts to izsauc jūsu vietā, kad notiek notikums.

void onPressed() {
  Brain.Screen.print("Screen pressed!");
}

// Call onPressed whenever the screen is pressed
int main() {
  vexcodeInit();
  Brain.Screen.pressed(onPressed);
}

Callback Signatures#

Katrai atzvanīšanas funkcijai jāseko noteiktam parakstam, kas definē:

  • Atgriešanas veids

  • Parametru skaits

  • Parametru veidi

Nepieciešamo parakstu nosaka API. Atzvanīšanas funkcijai ir precīzi jāatbilst šim parakstam.

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

Parametru nosaukumi ir aprakstoši un var atšķirties, taču atgriešanas veidam, parametru secībai un parametru tipiem ir precīzi jāsakrīt.

Funkcijas ar noklusējuma argumentiem#

Funkcijas var definēt noklusējuma vērtības vienam vai vairākiem parametriem. Noklusējuma arguments tiek izmantots, ja funkcijas izsaukšanas laikā šim parametram nav norādīta vērtība.

Noklusējuma argumentu noteikumi:

  • Noklusējuma argumentiem ir jābūt pēdējiem parametriem funkcijas definīcijā.

  • Kad parametram ir piešķirta noklusējuma vērtība, visiem parametriem pēc tā arī ir jābūt noklusējuma vērtībām.

  • Ja funkcija savā prototype norāda noklusējuma argumentus, šīs noklusējuma vērtības nedrīkst norādīt atkārtoti funkcijas definīcijā.

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