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#

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

return_type

Funktion palauttama tietotyyppi. Joitakin yleisiä asetuksia ovat:

  • void — Ei palauta mitään
  • int — Palauttaa kokonaisluvun
  • double — Palauttaa liukulukun
  • bool — Palauttaa true tai false
  • char — Palauttaa yhden merkin
  • const char* — Palauttaa tekstimerkkijonon
  • käyttäjän määrittämät tyypit — Palauttaa struct tai luokkaobjektin

function_name

Funktion nimi.

parameters

Valinnainen. Pilkuilla erotettu luettelo tyypitetyistä parametreista, jotka on kirjoitettu muodossa type name, jossa type määrittää parametrin tietotyypin ja name on tunniste, jota käytetään kyseisen arvon käyttämiseen funktion sisällä. Parametrit saavat syöttöarvot, kun funktiota kutsutaan.

result

Valinnainen. Funktion palauttama arvo. Jos funktion return_type ei ole void , tämä arvo on annettava ja sen tyypin on vastattava täsmälleen määritettyä return_type

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