0Pricing
C++ Academy · Leçon

Pointeurs de fonctions

Passer des fonctions comme arguments

Pointeurs de fonctions est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.

Qu'est-ce qu'un pointeur de fonction ?

Un pointeur de fonction stocke l'adresse d'une fonction afin que vous puissiez l'appeler indirectement ou le transmettre comme une donnée.

  • Le type encode la signature.
  • Il permet aux fonctions de recevoir un comportement en paramètre.
#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;
}

Déclarer le type

La déclaration int (*op)(int, int) se lit ainsi : op est un pointeur vers une fonction qui reçoit deux entiers et renvoie un entier. Les parenthèses autour de *op sont obligatoires.

#include <iostream>

int square(int x) { return x * x; }

int main() {
    int (*fn)(int) = square;
    std::cout << fn(5) << '\n';
    return 0;
}

Appeler via un pointeur

Vous appelez un pointeur de fonction exactement comme la fonction elle-même. Vous pouvez aussi le déréférencer explicitement, mais c'est rarement nécessaire.

#include <iostream>

void greet() { std::cout << "Hello\n"; }

int main() {
    void (*g)() = greet;
    g();
    (*g)();
    return 0;
}

Passer des fonctions en arguments

Une fonction peut accepter un paramètre de type pointeur de fonction, ce qui permet à l'appelant de fournir un comportement personnalisé.

#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;
}

Choisir lors de l'exécution

Comme un pointeur de fonction est une variable, vous pouvez décider quelle fonction appeler pendant l'exécution du programme.

#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;
}

Tableaux de pointeurs de fonction

Stockez plusieurs pointeurs de fonction dans un tableau pour construire une table de répartition simple, indexée par une valeur.

#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;
}

Utiliser un typedef

La syntaxe des pointeurs est peu lisible. Un alias typedef ou using donne au type un nom facile à lire.

#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;
}

Pointeurs de fonction et algorithmes

Les algorithmes standard acceptent les objets appelables, et une fonction ordinaire peut jouer ce rôle. Ici, un prédicat compte les nombres pairs.

#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;
}

Limitation : aucun état

Un pointeur de fonction ordinaire ne peut contenir aucune donnée capturée. Si vous devez conserver un contexte entre les appels, vous devez utiliser des variables globales ou passer à des objets appelables plus riches.

#include <iostream>

int counter = 0;
int next() { return ++counter; }

int main() {
    int (*fn)() = next;
    std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
    return 0;
}

Conversion des lambdas sans capture

Une lambda qui ne capture rien peut se convertir implicitement en un pointeur de fonction correspondant, ce qui est pratique pour les petites fonctions définies sur place.

#include <iostream>

int main() {
    int (*fn)(int) = [](int x) { return x + 100; };
    std::cout << fn(1) << '\n';
    return 0;
}

Pointeurs de fonction nuls

Un pointeur de fonction peut être nullptr, ce qui signifie qu'il ne pointe vers rien. Vérifiez-le toujours avant de l'appeler afin d'éviter un comportement indéfini.

#include <iostream>

int main() {
    int (*fn)(int) = nullptr;
    if (fn) {
        std::cout << fn(5) << '\n';
    } else {
        std::cout << "No function set\n";
    }
    return 0;
}

Vérification rapide

Vérifiez votre compréhension des limites des pointeurs de fonction.

Récapitulatif

Vous avez découvert les pointeurs de fonction :

  • ils contiennent l'adresse d'une fonction et s'appellent comme celle-ci
  • ils permettent de transmettre un comportement en paramètre et de construire des tables de répartition
  • les alias rendent leur type lisible
  • ils ne peuvent pas contenir d'état, mais les lambdas sans capture peuvent se convertir en pointeurs de fonction

Vous allez maintenant découvrir std::function, qui peut stocker n'importe quel objet appelable, y compris ceux qui possèdent un état.

Questions Fréquemment Posées

La leçon « Pointeurs de fonctions » est-elle gratuite ?

Oui — le texte complet de « Pointeurs de fonctions » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Pointeurs de fonctions » ?

Passer des fonctions comme arguments Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C++ Academy ?

Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Pointeurs de fonctions » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?

Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Pointeurs de fonctions
  2. std::function
  3. std::bind
  4. Choisir des appelables
← Retour à C++ Academy