Funktio-osoittimet
Välitä funktioita argumentteina
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 parametrinaan 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.
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
- Funktio-osoittimet
- std::function
- std::bind
- Kutsuttavien olioiden valinta