Toiminnot#
Johdanto#
Funktiot ovat C+±ohjelmoinnin peruskomponentti. Ne pakkaavat koodinpätkiä uudelleenkäytettäviksi ja tehokkaiksi koodiosiksi, jotka on suunniteltu suorittamaan tietty tehtävä. Funktioita voidaan kutsua useita kertoja ohjelman sisällä, mikä helpottaa koodin järjestämistä ja auttaa välttämään koodin toistamista. Funktiot myös helpottavat koodin virheenkorjausta.
Tämä sivu käsittelee C++:n funktioiden käytön perusteita, mukaan lukien:
Funktion rakenne ja syntaksi — Miten funktiot kirjoitetaan C++:lla, mukaan lukien paluutyypit, nimet ja parametrit.
Funktioprototyypit — Mitä prototyyppifunktiot ovat ja miksi niitä käytetään.
Funktioiden määrittely ja kutsuminen — Funktioiden luominen ja kutsuminen ohjelmasta.
Paluuarvot — Miten funktiot voivat lähettää tietoja takaisin kutsujalle.
Viitteen kautta ohittaminen — Kuinka funktiot voivat muokata muuttujia oman soveltamisalansa ulkopuolella.
Takaisinkutsufunktiot — Kuinka funktioita voidaan välittää muille funktioille ja kutsua automaattisesti tapahtumien perusteella.
Funktiot, joissa on oletusarvoargumentteja — Miten parametreille voidaan antaa oletusarvot, kun argumenttia ei anneta.
Funktion rakenne ja syntaksi#
C++:ssa funktiot on esitettävä paluuarvotyypillä, nimellä ja parametreilla. Perussyntaksi on:
return_type function_name(parameters) {
// Code to execute when the function is called
return result; // Optional, used to return a value
}
Toiminto-osat |
Kuvaus |
|---|---|
|
Funktion palauttama tietotyyppi. Joitakin yleisiä asetuksia ovat:
|
|
Funktion nimi. |
|
Valinnainen. Pilkuilla erotettu luettelo tyypitetyistä parametreista, jotka on kirjoitettu muodossa |
|
Valinnainen. Funktion palauttama arvo. Jos funktion |
Note: A function must always be declared before it is called, or you must provide a function prototype.
Toimintoprototyypit#
C++:ssa koodia luetaan ylhäältä alas. Tämä tarkoittaa, että kääntäjän on tunnettava funktio ennen kuin sitä voidaan kutsua.
Funktioprototyypin avulla voit käyttää funktiota ennen sen koko koodin kirjoittamista. Tämä mahdollistaa main() pitämisen ohjelman alussa ja funktiomääritelmien sijoittamisen myöhemmin, missä ne on helpompi järjestää ja lukea.
Ilman prototyyppiä sinun pitäisi määritellä jokainen funktio, jonka arvo on main(), mikä voi vaikeuttaa projektien seuraamista niiden kasvaessa.
Määrittele funktion prototyyppi (
int main())// The function's prototype void greeting();Kutsu funktiota
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); greeting(); }Kirjoita funktion runko sen jälkeen
void greeting() { Brain.Screen.print("Hello!"); }
Funktioiden määrittely ja kutsuminen#
Functions with No Parameters#
Jos funktio ei vaadi syötettä, voit määritellä sen ilman parametreja. Käytä paluutyyppinä void jos funktio ei palauta arvoa.
Määrittele funktio (
int main())// Define a function to display a message void greeting() { Brain.Screen.print("Hello!"); }Kutsu funktiota
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#
Voit myös lisätä funktioihin parametreja, joiden avulla voit välittää tietoja funktion käytettäväksi.
Huomautus: Tekstiä voidaan välittää käyttämällä C-tyylisiä merkkijonoja (const char*) tai C+±merkkijonoja (std::string).
Määrittele funktio (
int main())// Define a function with a parameter void namedGreeting(const char* name) { Brain.Screen.print("Hello, %s!", name); }Kutsu funktiota parametrilla nollan sisällä
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"); }
Paluuarvot#
Funktiot voivat lähettää dataa takaisin kutsujalle käyttämällä avainsanaa return Näin voit tallentaa ja käyttää tulostetta projektissasi.
Määrittele funktio (
int main())// Define a function that multiplies numbers by 2 int timesTwo(int number) { return number * 2; }Kutsu funktiota parametrilla nollan sisällä
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)); }
Viittauksen ohittaminen#
Oletusarvoisesti C++ välittää funktion parametrit arvon mukaan, mikä tarkoittaa, että funktio saa kopion alkuperäisestä muuttujan arvosta. Funktion sisällä tehdyt muutokset eivät vaikuta alkuperäiseen arvoon.
Määrittele funktio (
int main())// Add 1 to the number void addOne(int number) { number++; }Kutsu funktiota parametrilla nollan sisällä
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 }
Jotta funktio voisi muokata alkuperäistä muuttujaa, parametrit voidaan välittää viittauksella käyttämällä symboleja &.
Määrittele funktio (
int main())// Add 1 to the number void addOne(int& number) { number++; }Kutsu funktiota parametrilla nollan sisällä
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 }
Viittauksen kautta välittäminen sallii funktioiden päivittää funktion ulkopuolella määriteltyjä muuttujia palauttamatta arvoa.
Takaisinkutsufunktiot#
Takaisinkutsufunktio on funktio, joka välitetään toiselle funktiolle ja jota kutsutaan automaattisesti tietyn tapahtuman sattuessa.
Takaisinkutsuja käytetään yleisesti tapahtumiin, kuten painikkeiden painalluksiin tai anturipäivityksiin.
Sen sijaan, että funktiota kutsuttaisiin itse, projekti kutsuu sitä puolestasi, kun tapahtuma tapahtuu.
Määrittele takaisinkutsufunktio (
int main())// Create a callback function void onPressed() { Brain.Screen.print("Screen pressed!"); }Rekisteröi takaisinkutsu
int main()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#
Jokaisen takaisinkutsufunktion on seurattava tiettyä allekirjoitusta, joka määrittelee:
Paluutyyppi
Parametrien lukumäärä
Parametrityypit
Vaadittu allekirjoitus määräytyy API:n mukaan. Takaisinkutsufunktion on vastattava tätä allekirjoitusta täsmälleen.
// 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);
Parametrien nimet ovat kuvailevia ja voivat vaihdella, mutta paluuarvon tyypin, parametrien järjestyksen ja parametrityyppien on oltava täsmälleen samat.
Funktiot, joissa on oletusargumentit#
Funktiot voivat määrittää oletusarvot yhdelle tai useammalle parametrille. Oletusargumenttia käytetään, kun kyseiselle parametrille ei anneta arvoa funktiota kutsuttaessa.
Oletusargumenttien säännöt:
Oletusarvoisten argumenttien täytyy olla funktion määritelmän viimeiset parametrit.
Kun parametrilla on oletusarvo, kaikilla sen jälkeisillä parametreilla on myös oltava oletusarvot.
Jos funktio määrittää oletusarvoargumentit prototype-muuttujassaan, näitä oletusarvoja ei saa määrittää uudelleen funktion määritelmässä.
Määrittele funktio (
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(); } }Kutsu funktiota
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);
}