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.

Definējiet funkcijas prototipu (ārpus int main())

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

Izsauciet funkciju int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  greeting();
}

Uzrakstiet funkcijas pamattekstu pēc

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.

Definējiet funkciju (ārpus int main())

// Define a function to display a message
void greeting() {
    Brain.Screen.print("Hello!");
}

Izsauciet funkciju 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#

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).

Definējiet funkciju (ārpus int main())

// Define a function with a parameter
void namedGreeting(const char* name) {
    Brain.Screen.print("Hello, %s!", name);
}

Izsauciet funkciju ar parametru 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");
}

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ā.

Definējiet funkciju (ārpus int main())

// Define a function that multiplies numbers by 2
int timesTwo(int number) {
    return number * 2;
}

Izsauciet funkciju ar parametru 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));
}

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.

Definējiet funkciju (ārpus int main())

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

Izsauciet funkciju ar parametru 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
}

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

Definējiet funkciju (ārpus int main())

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

Izsauciet funkciju ar parametru 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
}

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.

Definējiet atzvanīšanas funkciju (ārpus int main())

// Create a callback function
void onPressed() {
  Brain.Screen.print("Screen pressed!");
}

Reģistrējiet atzvanīšanas funkciju int main() iekšpusē

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#

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ā.

Definējiet funkciju (ārpus 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();
    }
}

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