Objetos de função e funtores
Escreva classes com operator() para criar objetos chamáveis com estado
Objetos de função e funtores é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
O que é um funtor
Um funtor (objeto de função) é uma classe que sobrecarrega operator(). As instâncias podem ser chamadas como funções.
struct Square {
int operator()(int x) const { return x * x; }
};
Square sq;
std::cout << sq(5); // 25Por que não usar apenas uma função
Os funtors carregam estado. Uma função comum não faz isso. O estado permite configurar, contar e usar retornos de chamada com estado.
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 configurável
Armazene a configuração nos membros do funtor. O mesmo tipo de funtor funciona com vários conjuntos de parâmetros.
struct GreaterThan {
int threshold;
bool operator()(int x) const { return x > threshold; }
};
GreaterThan over10{10};
over10(15); // true
over10(5); // falseUsando funtors com algoritmos da STL
Os algoritmos da STL aceitam qualquer coisa chamável — funtors, lambdas e ponteiros de função.
std::vector<int> v = {1, 11, 5, 99, 8};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});
std::cout << *it; // 11Funtors predefinidos em <functional>
A biblioteca padrão fornece funtors prontos: std::plus, std::less, std::equal_to, std::negate e outros.
#include <functional>
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end(), std::greater<int>{});
// sorted descendingFuntor versus ponteiro de função
Os funtors geralmente são melhor incorporados em linha porque seu operator() é uma chamada direta. Os ponteiros de função podem ser mais flexíveis, mas fazem chamadas indiretas.
Funtors como parâmetros de modelos
Muitos contêineres e algoritmos da STL aceitam um funtor como parâmetro de modelo — comparadores de conjuntos, funções de dispersão e alocadores.
std::set<int, std::greater<int>> s = {1, 2, 3};
// s iterates in descending order: 3, 2, 1Lambdas são funtors
O compilador gera uma classe exclusiva com operator() para cada lambda. Lambdas são uma forma de açúcar sintático sobre funtors.
Quando escrever um funtor
Use um funtor escrito manualmente quando:
- A mesma lógica for usada em muitos lugares (dê um nome a ela)
- Ela fizer parte da sua API pública
- For necessário que ele possa ser construído por cópia ou movimentação com um comportamento específico
Quando usar uma lambda em vez disso
Para um uso único, uma lambda é mais curta e clara. Para um comportamento reutilizável, um funtor nomeado melhora a legibilidade.
Composição
Combine funtors usando std::bind ou, de forma mais moderna, compondo lambdas. Bibliotecas funcionais como a Boost também fornecem combinadores.
Verificação rápida
Qual é a principal capacidade de um funtor em comparação com uma função comum?
Recapitulação
Um funtor é uma classe com operator(). Ele carrega estado, integra-se aos algoritmos da STL e serve de base para lambdas. Use funtors nomeados para comportamentos reutilizáveis e lambdas para lógicas usadas uma única vez.
Perguntas Frequentes
A aula “Objetos de função e funtores” é grátis?
Sim — o texto completo de “Objetos de função e funtores” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “Objetos de função e funtores”?
Escreva classes com operator() para criar objetos chamáveis com estado Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Objetos de função e funtores”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Objetos de função e funtores
- Capturas de lambdas por valor, por referência e mutable
- Lambdas genéricas e encerramentos no C++14
- std::function: objetos chamáveis com apagamento de tipo