0Pricing
C++ Academy · Aula

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

  1. Ponteiros para funções
  2. std::function
  3. std::bind
  4. Escolha de objetos chamáveis
← Voltar para C++ Academy