C++ Academy · Oppitunti

Funktio-osoittimet

Välitä funktioita argumentteina

Oppitunti 1/413 vaihetta

Funktio-osoittimet on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on funktio-osoitin?

Funktio-osoitin tallentaa funktion osoitteen, joten voitte kutsua funktiota epäsuorasti tai välittää sitä kuten dataa.

  • Sen tyyppi sisältää funktion allekirjoituksen.
  • Sen avulla funktiot voivat vastaanottaa toiminnallisuuden parametrina.
#include <iostream>

int add(int a, int b) { return a + b; }

int main() {
    int (*op)(int, int) = add;
    std::cout << op(3, 4) << '\n';
    return 0;
}

Tyypin määrittäminen

Määrittely int (*op)(int, int) tarkoittaa, että op on osoitin funktioon, joka ottaa kaksi int-arvoa ja palauttaa int-arvon. *op-merkinnän ympärillä olevat sulkeet ovat pakolliset.

#include <iostream>

int square(int x) { return x * x; }

int main() {
    int (*fn)(int) = square;
    std::cout << fn(5) << '\n';
    return 0;
}

Kutsuminen osoittimen kautta

Funktio-osoitinta kutsutaan aivan kuten itse funktiota. Voitte myös purkaa osoittimen viittauksen eksplisiittisesti, mutta sitä tarvitaan harvoin.

#include <iostream>

void greet() { std::cout << "Hello\n"; }

int main() {
    void (*g)() = greet;
    g();
    (*g)();
    return 0;
}

Funktioiden välittäminen argumentteina

Funktio voi vastaanottaa parametri­naan funktio-osoittimen, jolloin kutsuja voi antaa käyttöön mukautettua toiminnallisuutta.

#include <iostream>

int apply(int x, int (*fn)(int)) { return fn(x); }
int doubler(int n) { return n * 2; }

int main() {
    std::cout << apply(10, doubler) << '\n';
    return 0;
}

Valinta ajon aikana

Koska funktio-osoitin on muuttuja, voitte päättää ohjelman suorituksen aikana, mitä funktiota kutsutaan.

#include <iostream>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main() {
    bool wantAdd = true;
    int (*op)(int, int) = wantAdd ? add : sub;
    std::cout << op(8, 3) << '\n';
    return 0;
}

Funktio-osoittimien taulukot

Useiden funktio-osoittimien tallentaminen taulukkoon mahdollistaa arvon perusteella indeksoidun yksinkertaisen dispatch-taulukon rakentamisen.

#include <iostream>

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }

int main() {
    int (*ops[2])(int, int) = {add, mul};
    std::cout << ops[0](2, 3) << ' ' << ops[1](2, 3) << '\n';
    return 0;
}

typedef-määreen käyttäminen

Osoitinsyntaksi on hankala lukea. typedef- tai using-alias antaa tyypille selkeän nimen.

#include <iostream>

using BinOp = int(*)(int, int);
int add(int a, int b) { return a + b; }

int main() {
    BinOp op = add;
    std::cout << op(6, 7) << '\n';
    return 0;
}

Funktio-osoittimet algoritmien kanssa

Standardialgoritmit hyväksyvät kutsuttavia olioita, ja tavallinen funktio toimii sellaisena. Tässä predikaatti laskee parilliset luvut.

#include <iostream>
#include <vector>
#include <algorithm>

bool isEven(int n) { return n % 2 == 0; }

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5, 6};
    int c = std::count_if(v.begin(), v.end(), isEven);
    std::cout << "Evens: " << c << '\n';
    return 0;
}

Rajoitus: ei tilaa

Tavallinen funktio-osoitin ei voi sisältää kaapattua dataa. Jos tarvitsette kontekstin säilyttämistä kutsujen välillä, teidän on käytettävä globaaleja muuttujia tai siirryttävä monipuolisempiin kutsuttaviin olioihin.

#include <iostream>

int counter = 0;
int next() { return ++counter; }

int main() {
    int (*fn)() = next;
    std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
    return 0;
}

Tilattomat lambdat muuntuvat

Lambda, joka ei kaappaa mitään, voi muuntua implisiittisesti vastaavaksi funktio-osoittimeksi. Tämä on kätevää pienissä funktion määrittelyissä suoraan käyttöpaikassa.

#include <iostream>

int main() {
    int (*fn)(int) = [](int x) { return x + 100; };
    std::cout << fn(1) << '\n';
    return 0;
}

Tyhjät funktio-osoittimet

Funktio-osoitin voi olla nullptr, mikä tarkoittaa, ettei se osoita mihinkään. Tarkistakaa osoitin aina ennen kutsumista määrittelemättömän toiminnan välttämiseksi.

#include <iostream>

int main() {
    int (*fn)(int) = nullptr;
    if (fn) {
        std::cout << fn(5) << '\n';
    } else {
        std::cout << "No function set\n";
    }
    return 0;
}

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte funktio-osoittimien rajoituksia.

Kertaus

Opitte funktio-osoittimista:

  • ne sisältävät funktion osoitteen, ja niitä kutsutaan kuten funktiota
  • niiden avulla voitte välittää toiminnallisuutta parametrina ja rakentaa dispatch-taulukoita
  • aliakset tekevät niiden tyypistä helposti luettavan
  • ne eivät voi sisältää tilaa, mutta tilattomat lambdat muuntuvat niiksi

Seuraavaksi tutustutte std::function-tyyppiin, joka voi sisältää minkä tahansa kutsuttavan olion, myös tilallisen.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Funktio-osoittimet” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Funktio-osoittimet”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Funktio-osoittimet”?

Välitä funktioita argumentteina Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Funktio-osoittimet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Funktio-osoittimet
  2. std::function
  3. std::bind
  4. Kutsuttavien olioiden valinta
← Takaisin: C++ Academy