C++ Academy · leksjon

Funksjonspekere

Send funksjoner som argumenter

Leksjon 1 av 413 trinn

Funksjonspekere er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hva er en funksjonspeker?

En funksjonspeker lagrer adressen til en funksjon, slik at du kan kalle den indirekte eller sende den rundt som data.

  • Typen beskriver signaturen.
  • Den lar funksjoner ta imot atferd som en parameter.
#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;
}

Deklarere typen

Deklarasjonen int (*op)(int, int) leses slik: op er en peker til en funksjon som tar imot to int-verdier og returnerer en int. Parentesene rundt *op er nødvendige.

#include <iostream>

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

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

Kalle via en peker

Du kaller en funksjonspeker på samme måte som selve funksjonen. Du kan også dereferere den eksplisitt, men det er sjelden nødvendig.

#include <iostream>

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

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

Sende funksjoner som argumenter

En funksjon kan ta imot en funksjonspeker som parameter, slik at den som kaller funksjonen kan koble inn egendefinert atferd.

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

Velge under kjøring

Siden en funksjonspeker er en variabel, kan du bestemme hvilken funksjon som skal kalles mens programmet kjører.

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

Arrayer med funksjonspekere

Lag en enkel dispatch-tabell ved å lagre flere funksjonspekere i en array som indekseres med en verdi.

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

Bruke en typedef

Pekersyntaksen er omstendelig. Et typedef- eller using-alias gir typen et lesbart navn.

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

Funksjonspekere med algoritmer

Standardalgoritmer tar imot kallbare objekter, og en vanlig funksjon fungerer som et slikt objekt. Her teller et predikat partall.

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

Begrensning: Ingen tilstand

En vanlig funksjonspeker kan ikke inneholde fangede data. Hvis du trenger å huske kontekst mellom kall, må du bruke globale variabler eller gå over til mer avanserte kallbare objekter.

#include <iostream>

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

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

Lambdas uten variabelfangst kan konverteres

En lambda som ikke fanger noe, kan konverteres implisitt til en samsvarende funksjonspeker. Dette er praktisk for små funksjoner skrevet direkte i koden.

#include <iostream>

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

Null-funksjonspekere

En funksjonspeker kan være nullptr, noe som betyr at den ikke peker på noe. Kontroller alltid pekeren før du kaller den, slik at du unngår udefinert atferd.

#include <iostream>

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

Hurtigsjekk

Test forståelsen din av begrensningene til funksjonspekere.

Oppsummering

Du har lært om funksjonspekere:

  • de inneholder adressen til en funksjon og kalles som funksjonen
  • de lar deg sende atferd som en parameter og bygge dispatch-tabeller
  • aliaser gjør typen lesbar
  • de kan ikke inneholde tilstand, men lambdas uten variabelfangst kan konverteres til dem

Deretter møter du std::function, som kan lagre alle kallbare objekter, også objekter med tilstand.

Gratis å komme i gang

Lær deg C++ med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «Funksjonspekere» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «Funksjonspekere», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Funksjonspekere»?

Send funksjoner som argumenter Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C++ Academy?

Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Funksjonspekere»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?

Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Funksjonspekere
  2. std::function
  3. std::bind
  4. Velge kallbare objekter
← Tilbake til C++ Academy