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 — Kā funkcijas tiek rakstītas valodā C++, tostarp atgriešanas tipi, nosaukumi un parametri.
Funkciju prototipi — Kas ir prototipa funkcijas un kāpēc tās tiek izmantotas.
Funkciju definēšana un izsaukšana — Kā izveidot funkcijas un izsaukt tās no savas programmas.
Atgriešanas vērtības — Kā funkcijas var nosūtīt datus atpakaļ izsaucējam.
Passing by Reference — Kā funkcijas var modificēt variables ārpus savas darbības jomas.
Atzvanīšanas funkcijas — Kā funkcijas var nodot citām funkcijām un automātiski izsaukt, reaģējot uz notikumiem.
Funkcijas ar noklusējuma argumentiem — Kā parametriem var piešķirt noklusējuma vērtības, ja nav norādīts arguments.
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 |
|---|---|
|
Funkcijas atgriežamais datu tips. Dažas izplatītākās opcijas ir:
|
|
Funkcijas nosaukums. |
|
Neobligāti. Ar komatiem atdalīts tipizētu parametru saraksts, kas rakstīts kā |
|
Neobligāti. Funkcijas atgrieztā vērtība. Ja funkcijas |
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);
}