Oggetti funzione e functor
Scriva classi con operator() per creare oggetti chiamabili con stato
Oggetti funzione e functor è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Che cos'è un funtore?
Un funtore (oggetto funzione) è una classe che sovraccarica operator(). Le istanze possono essere chiamate come funzioni.
struct Square {
int operator()(int x) const { return x * x; }
};
Square sq;
std::cout << sq(5); // 25Perché non usare semplicemente una funzione?
I funtori mantengono uno stato. Una funzione normale no. Lo stato consente la configurazione, il conteggio e le callback con stato.
struct Counter {
int count = 0;
int operator()(int x) { ++count; return x; }
};
Counter c;
c(10); c(20); c(30);
std::cout << c.count; // 3Comportamento configurabile
Memorizzate la configurazione nei membri del funtore. Lo stesso tipo di funtore funziona con molti insiemi di parametri.
struct GreaterThan {
int threshold;
bool operator()(int x) const { return x > threshold; }
};
GreaterThan over10{10};
over10(15); // true
over10(5); // falseUtilizzare i funtori con gli algoritmi STL
Gli algoritmi STL accettano qualsiasi elemento chiamabile: funtori, lambda e puntatori a funzione.
std::vector<int> v = {1, 11, 5, 99, 8};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});
std::cout << *it; // 11Funtori predefiniti in <functional>
La libreria standard fornisce funtori pronti all'uso: std::plus, std::less, std::equal_to, std::negate e altri.
#include <functional>
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end(), std::greater<int>{});
// sorted descendingFuntore e puntatore a funzione
I funtori vengono generalmente integrati meglio, perché il loro operator() è una chiamata diretta. I puntatori a funzione possono essere più flessibili, ma comportano una chiamata indiretta.
Funtori come parametri di template
Molti contenitori e algoritmi STL accettano un funtore come parametro di template: comparatori per set, funzioni hash e allocatori.
std::set<int, std::greater<int>> s = {1, 2, 3};
// s iterates in descending order: 3, 2, 1Le lambda sono funtori
Il compilatore genera una classe univoca con operator() per ogni lambda. Le lambda sono zucchero sintattico per i funtori.
Quando scrivere un funtore
Utilizzate un funtore scritto manualmente quando:
- La stessa logica viene usata in molti punti (assegnatele un nome)
- Fa parte della vostra API pubblica
- Deve essere costruibile per copia o per move con un comportamento specifico
Quando usare invece una lambda
Per un utilizzo occasionale, una lambda è più breve e chiara. Per un comportamento riutilizzabile, un funtore con nome migliora la leggibilità.
Componibilità
Componete i funtori usando std::bind o, in modo più moderno, componendo lambda. Anche librerie funzionali come Boost forniscono combinatori.
Verifica rapida
Qual è la capacità principale di un funtore rispetto a una funzione normale?
Riepilogo
Un funtore è una classe con operator(). Mantiene uno stato, si integra con gli algoritmi STL e costituisce la base delle lambda. Utilizzate funtori con nome per i comportamenti riutilizzabili e lambda per la logica da eseguire una sola volta.
Domande Frequenti
La lezione «Oggetti funzione e functor» è gratuita?
Sì — il testo completo di «Oggetti funzione e functor» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Oggetti funzione e functor»?
Scriva classi con operator() per creare oggetti chiamabili con stato Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Oggetti funzione e functor»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Oggetti funzione e functor
- Capture delle lambda: per valore, per riferimento, mutable
- Lambda generiche e closure in C++14
- std::function: oggetti chiamabili type-erased