Ponteiros para funções
Passe funções como argumentos
Ponteiros para funções é 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 ponteiro de função?
Um ponteiro de função armazena o endereço de uma função para que você possa chamá-la indiretamente ou passá-la como dado.
- O tipo codifica a assinatura.
- Ele permite que as funções recebam comportamento como parâmetro.
#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;
}Declarando o tipo
A declaração int (*op)(int, int) pode ser lida assim: op é um ponteiro para uma função que recebe dois inteiros e retorna um inteiro. Os parênteses ao redor de *op são obrigatórios.
#include <iostream>
int square(int x) { return x * x; }
int main() {
int (*fn)(int) = square;
std::cout << fn(5) << '\n';
return 0;
}Chamando por meio de um ponteiro
Você chama um ponteiro de função da mesma forma que a própria função. Também é possível desreferenciá-lo explicitamente, mas isso raramente é necessário.
#include <iostream>
void greet() { std::cout << "Hello\n"; }
int main() {
void (*g)() = greet;
g();
(*g)();
return 0;
}Passando funções como argumentos
Uma função pode aceitar um parâmetro que seja um ponteiro de função, permitindo que o chamador forneça um comportamento personalizado.
#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;
}Escolhendo em tempo de execução
Como um ponteiro de função é uma variável, você pode decidir qual função chamar enquanto o programa está em execução.
#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;
}Matrizes de ponteiros de função
Armazene vários ponteiros de função em uma matriz para criar uma tabela de despacho simples indexada por um valor.
#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;
}Usando um typedef
A sintaxe de ponteiros é pouco legível. Um alias typedef ou using dá ao tipo um nome fácil de ler.
#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;
}Ponteiros de função com algoritmos
Os algoritmos padrão aceitam objetos chamáveis, e uma função comum pode ser usada como um deles. Aqui, um predicado conta os números pares.
#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;
}Limitação: sem estado
Um ponteiro de função comum não pode transportar dados capturados. Se você precisar manter um contexto entre chamadas, deverá usar variáveis globais ou recorrer a objetos chamáveis mais completos.
#include <iostream>
int counter = 0;
int next() { return ++counter; }
int main() {
int (*fn)() = next;
std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
return 0;
}Lambdas sem captura são convertidas
Uma lambda que não captura nada pode ser convertida implicitamente em um ponteiro de função compatível, o que é útil para pequenas funções embutidas.
#include <iostream>
int main() {
int (*fn)(int) = [](int x) { return x + 100; };
std::cout << fn(1) << '\n';
return 0;
}Ponteiros de função nulos
Um ponteiro de função pode ser nullptr, o que significa que ele não aponta para nada. Sempre verifique-o antes de chamá-lo para evitar comportamento indefinido.
#include <iostream>
int main() {
int (*fn)(int) = nullptr;
if (fn) {
std::cout << fn(5) << '\n';
} else {
std::cout << "No function set\n";
}
return 0;
}Verificação rápida
Teste a sua compreensão sobre as limitações dos ponteiros de função.
Recapitulação
Você aprendeu sobre ponteiros de função:
- eles armazenam o endereço de uma função e são chamados como a função
- permitem passar comportamento como parâmetro e criar tabelas de despacho
- os aliases tornam o tipo mais legível
- não podem transportar estado, mas lambdas sem captura podem ser convertidas neles
Em seguida, você conhecerá std::function, que pode armazenar qualquer objeto chamável, inclusive objetos com estado.
Perguntas Frequentes
A aula “Ponteiros para funções” é grátis?
Sim — o texto completo de “Ponteiros para funções” é 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 “Ponteiros para funções”?
Passe funções como argumentos 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 “Ponteiros para funções”?
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
- Ponteiros para funções
- std::function
- std::bind
- Escolha de objetos chamáveis