0Pricing
C++ Academy · Aula

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);   // 25

Por 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;   // 3

Comportamento 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);     // false

Usando 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;   // 11

Funtors 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 descending

Funtor 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, 1

Lambdas 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

  1. Objetos de função e funtores
  2. Capturas de lambdas por valor, por referência e mutable
  3. Lambdas genéricas e encerramentos no C++14
  4. std::function: objetos chamáveis com apagamento de tipo
← Voltar para C++ Academy