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