C++ Academy · Lektion

Funktionspointere

Videregiv funktioner som argumenter

Lektion 1 af 413 trin

Funktionspointere er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad er en funktionspeger

En funktionspeger gemmer adressen på en funktion, så du kan kalde den indirekte eller videregive den som data.

  • Typen indeholder signaturen.
  • Den gør det muligt for funktioner at tage adfærd som 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;
}

Deklaration af typen

Deklarationen int (*op)(int, int) læses sådan: op er en peger til en funktion, der tager to heltal og returnerer et heltal. Parenteserne omkring *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;
}

Kald gennem en peger

Du kalder en funktionspeger på samme måde som selve funktionen. Du kan også dereferere den eksplicit, men det er sjældent nødvendigt.

#include <iostream>

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

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

Videregivelse af funktioner som argumenter

En funktion kan tage en funktionspeger som parameter, så den kaldende kode kan indsætte sin egen adfærd.

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

Valg under kørsel

Fordi en funktionspeger er en variabel, kan du beslutte, hvilken funktion der skal kaldes, mens programmet kø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;
}

Tabeller med funktionspegere

Gem flere funktionspegere i en tabel for at opbygge en enkel fordelingstabel, der slås op ved hjælp af en værdi.

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

Brug af typedef

Pege-syntaksen er omstændelig. Et alias med typedef eller using giver typen et læsbart 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;
}

Funktionspegere med algoritmer

Standardalgoritmer accepterer kaldbare enheder, og en almindelig funktion kan bruges som en sådan. Her tæller et prædikat lige tal.

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

Begrænsning: Ingen tilstand

En almindelig funktionspeger kan ikke indeholde indfangede data. Hvis du skal huske kontekst mellem kald, må du bruge globale variabler eller skifte til mere avancerede kaldbare enheder.

#include <iostream>

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

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

Lambdafunktioner uden indfangning kan konverteres

En lambda, der ikke indfanger noget, kan konverteres implicit til en matchende funktionspeger, hvilket er praktisk til små indlejrede funktioner.

#include <iostream>

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

Null-funktionspegere

En funktionspeger kan være nullptr, hvilket betyder, at den ikke peger på noget. Kontrollér altid dette, før du kalder den, for at undgå udefineret adfærd.

#include <iostream>

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

Hurtig kontrol

Afprøv din forståelse af funktionspegeres begrænsninger.

Opsummering

Du har lært om funktionspegere:

  • de indeholder en funktions adresse og kaldes som funktionen
  • de gør det muligt at videregive adfærd som parameter og opbygge fordelingstabeller
  • aliasser gør deres type læsbar
  • de kan ikke indeholde tilstand, men lambdafunktioner uden indfangning kan konverteres til dem

Nu møder du std::function, som kan gemme enhver kaldbar enhed, også enheder med tilstand.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Funktionspointere” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Funktionspointere”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Funktionspointere”?

Videregiv funktioner som argumenter Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Funktionspointere”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Funktionspointere
  2. std::function
  3. std::bind
  4. Valg af callables
← Tilbage til C++ Academy