Functieaanwijzers
Geef functies door als argumenten
Functieaanwijzers is een gratis C++ Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C++ Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C++ Academy bevat in totaal 4 lessen.
Wat is een functiepointer?
Een functiepointer slaat het adres van een functie op, zodat je die indirect kunt aanroepen of als gegevens kunt doorgeven.
- Het type legt de signatuur vast.
- Functies kunnen hiermee gedrag als parameter aannemen.
#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;
}Het type declareren
De declaratie int (*op)(int, int) lees je als volgt: op is een pointer naar een functie die twee ints accepteert en een int retourneert. De haakjes rond *op zijn vereist.
#include <iostream>
int square(int x) { return x * x; }
int main() {
int (*fn)(int) = square;
std::cout << fn(5) << '\n';
return 0;
}Aanroepen via een pointer
Je roept een functiepointer net zo aan als de functie zelf. Je kunt de pointer ook expliciet derefereren, maar dat is zelden nodig.
#include <iostream>
void greet() { std::cout << "Hello\n"; }
int main() {
void (*g)() = greet;
g();
(*g)();
return 0;
}Functies als argumenten doorgeven
Een functie kan een functiepointer als parameter accepteren, zodat de aanroeper aangepast gedrag kan invoegen.
#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;
}Tijdens uitvoering kiezen
Omdat een functiepointer een variabele is, kun je tijdens het uitvoeren van het programma bepalen welke functie wordt aangeroepen.
#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;
}Arrays met functiepointers
Sla meerdere functiepointers op in een array om een eenvoudige dispatchtabel te maken die met een waarde wordt geïndexeerd.
#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;
}Een typedef gebruiken
De syntaxis van pointers is omslachtig. Met een alias via typedef of using geef je het type een leesbare naam.
#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;
}Functiepointers met algoritmen
Standaardalgoritmen accepteren aanroepbare objecten, en een gewone functie werkt als zo'n object. Hier telt een predicaat de even getallen.
#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;
}Beperking: geen status
Een gewone functiepointer kan geen vastgelegde gegevens bevatten. Als je context tussen aanroepen wilt onthouden, moet je globale variabelen gebruiken of overstappen op uitgebreidere aanroepbare objecten.
#include <iostream>
int counter = 0;
int next() { return ++counter; }
int main() {
int (*fn)() = next;
std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
return 0;
}Lambdas zonder vastlegging kunnen worden omgezet
Een lambda die niets vastlegt, kan impliciet worden omgezet naar een overeenkomende functiepointer. Dat is handig voor kleine inlinefuncties.
#include <iostream>
int main() {
int (*fn)(int) = [](int x) { return x + 100; };
std::cout << fn(1) << '\n';
return 0;
}Null-functiepointers
Een functiepointer kan nullptr zijn, wat betekent dat hij nergens naartoe wijst. Controleer dit altijd voordat je hem aanroept om ongedefinieerd gedrag te voorkomen.
#include <iostream>
int main() {
int (*fn)(int) = nullptr;
if (fn) {
std::cout << fn(5) << '\n';
} else {
std::cout << "No function set\n";
}
return 0;
}Korte toets
Toets je begrip van de beperkingen van functiepointers.
Samenvatting
Je hebt geleerd over functiepointers:
- ze bevatten het adres van een functie en worden net als de functie aangeroepen
- ze laten je gedrag als parameter doorgeven en dispatchtabellen bouwen
- aliassen maken hun type leesbaar
- ze kunnen geen status bevatten, maar lambdas zonder vastlegging kunnen naar functiepointers worden omgezet
Vervolgens maak je kennis met std::function, waarin elk aanroepbaar object kan worden opgeslagen, ook objecten met status.
Leer C++ met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 51
- Lessen
- 203
Veelgestelde vragen
Is de les “Functieaanwijzers” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad C++ Academy, waaronder “Functieaanwijzers”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus C++ Academy bevat in totaal 4 lessen.
Wat leer ik in “Functieaanwijzers”?
Geef functies door als argumenten Je oefent met C++ Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C++ Academy te beginnen?
Ervaring vooraf is niet nodig. C++ Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “Functieaanwijzers”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C++ Academy?
Ja. Elke les over C++ Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Functieaanwijzers
- std::function
- std::bind
- Callables kiezen