Funktionsobjekter og funktorer
Skriv klasser med operator() for at oprette tilstandsfulde objekter, der kan kaldes
Funktionsobjekter og funktorer 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 funktor
En funktor (funktionsobjekt) er en klasse, der overbelaster operator(). Instanser kan kaldes som funktioner.
struct Square {
int operator()(int x) const { return x * x; }
};
Square sq;
std::cout << sq(5); // 25Hvorfor ikke bare en funktion
Funktorer indeholder tilstand. Det gør en almindelig funktion ikke. Tilstand muliggør konfiguration, optælling og tilstandsbaserede tilbagekald.
struct Counter {
int count = 0;
int operator()(int x) { ++count; return x; }
};
Counter c;
c(10); c(20); c(30);
std::cout << c.count; // 3Konfigurerbar adfærd
Gem konfigurationen i funktorens medlemmer. Den samme funktortype fungerer med mange parametersæt.
struct GreaterThan {
int threshold;
bool operator()(int x) const { return x > threshold; }
};
GreaterThan over10{10};
over10(15); // true
over10(5); // falseBrug af funktorer med STL-algoritmer
STL-algoritmer accepterer alt, der kan kaldes — funktorer, lambdafunktioner og funktionspointere.
std::vector<int> v = {1, 11, 5, 99, 8};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});
std::cout << *it; // 11Foruddefinerede funktorer i <functional>
Standardbiblioteket indeholder færdige funktorer: std::plus, std::less, std::equal_to, std::negate og flere.
#include <functional>
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end(), std::greater<int>{});
// sorted descendingFunktor kontra funktionspointer
Funktorer kan normalt bedre inline-optimeres, fordi deres operator() er et direkte kald. Funktionspointere kan være mere fleksible, men kaldes indirekte.
Funktorer som skabelonparametre
Mange STL-containere og -algoritmer accepterer en funktor som skabelonparameter — sammenlignere til set-containere, hashfunktioner og allokatorer.
std::set<int, std::greater<int>> s = {1, 2, 3};
// s iterates in descending order: 3, 2, 1Lambdafunktioner er funktorer
Kompileren genererer en entydig klasse med operator() for hver lambdafunktion. Lambdafunktioner er syntaktisk sukker oven på funktorer.
Hvornår bør du skrive en funktor
Brug en håndskrevet funktor når:
- Den samme logik bruges mange steder (giv den et navn)
- Den er en del af din offentlige API
- Den skal kunne kopikonstrureres eller flyttekonstrueres med en bestemt adfærd
Hvornår bør du i stedet bruge en lambdafunktion
Til engangsbrug er en lambdafunktion kortere og tydeligere. Til genbrugelig adfærd giver en navngiven funktor bedre læsbarhed.
Komponérbarhed
Kombinér funktorer med std::bind eller, mere moderne, ved at komponere lambdafunktioner. Funktionelle biblioteker som Boost tilbyder også kombinatorer.
Hurtig kontrol
Hvad er en funktors vigtigste egenskab sammenlignet med en almindelig funktion?
Opsummering
En funktor er en klasse med operator(). Den indeholder tilstand, integreres med STL-algoritmer og danner grundlaget for lambdafunktioner. Brug navngivne funktorer til genbrugelig adfærd og lambdafunktioner til engangslogik.
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 “Funktionsobjekter og funktorer” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Funktionsobjekter og funktorer”, 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 “Funktionsobjekter og funktorer”?
Skriv klasser med operator() for at oprette tilstandsfulde objekter, der kan kaldes 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 “Funktionsobjekter og funktorer”?
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
- Funktionsobjekter og funktorer
- Lambda-captures efter værdi, efter reference, mutable
- Generiske lambdaer og closures i C++14
- std::function – typeudviskede callable-objekter