Maison  >  Article  >  développement back-end  >  Comment transmettre et appeler des fonctions à l’aide de pointeurs de fonctions C++ ?

Comment transmettre et appeler des fonctions à l’aide de pointeurs de fonctions C++ ?

王林
王林original
2024-04-17 16:36:01870parcourir

Les pointeurs de fonction permettent de transmettre des fonctions en tant que paramètres, ce qui rend les appels de fonctions plus flexibles. Vous déclarez un pointeur de fonction, transmettez des paramètres et appelez la fonction pointée via des opérateurs de pointeur. Des fonctions avancées telles que la planification dynamique et la sélection d'algorithmes de tri peuvent être implémentées via des pointeurs de fonction.

如何使用 C++ 函数指针传递和调用函数?

Comment transmettre et appeler des fonctions à l'aide de pointeurs de fonction C++

Un pointeur de fonction est un type spécial de pointeur qui pointe vers une fonction. Les pointeurs de fonction nous permettent de transmettre des fonctions comme arguments à d'autres fonctions, permettant ainsi des appels de fonctions de niveau supérieur.

Déclaration et initialisation du pointeur de fonction

Pour déclarer un pointeur de fonction, nous devons spécifier le type de retour et le type de paramètre de la fonction :

int (*func_ptr)(int, int);

Le code ci-dessus déclare un pointeur de fonction func_ptr, qui pointe vers une fonction de réception qui prend deux entiers et renvoie un entier. func_ptr,它指向一个接收两个整数并返回一个整数的函数。

要初始化函数指针,我们可以使用函数名或函数指针:

func_ptr = my_function;  // 使用函数名
func_ptr = &my_function; // 使用函数指针

其中 my_function 是具有相应签名的函数。

传递函数指针

可以将函数指针作为参数传递给其他函数:

void call_function(int (*func)(int, int)) {
    int result = func(1, 2);
    // ...
}

上面函数 call_function 接收一个函数指针 func,该函数指针指向一个接收两个整数并返回一个整数的函数。

调用函数指针

要调用通过函数指针指向的函数,我们需要使用指针运算符 (*):

int result = (*func_ptr)(1, 2);  // 调用通过 func_ptr 指向的函数

实战案例

考虑以下使用函数指针排序数组的示例:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int compare(int a, int b) {
    return a > b;
}

bool greater_than(int a, int b) {
    return a > b;
}

int main() {
    vector<int> arr = {1, 4, 2, 8, 5};

    // 使用函数指针 compare 降序排序
    sort(arr.begin(), arr.end(), compare);

    // 使用 lambda 表达式升序排序
    sort(arr.begin(), arr.end(), [](int a, int b) {
        return a < b;
    });

    // 使用 std::greater 升序排序
    sort(arr.begin(), arr.end(), greater<int>());

    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在上面的示例中,我们定义了三个比较函数:

  • compare:降序比较函数
  • greater_than:升序比较函数(使用函数指针)
  • [](int a, int b) { return a < b; }:升序比较函数(使用 lambda 表达式)

函数 sort

Pour initialiser un pointeur de fonction, on peut utiliser le nom de la fonction ou le pointeur de fonction : 🎜rrreee🎜où ma_fonction est la fonction avec la signature correspondante. 🎜🎜🎜Passer des pointeurs de fonction🎜🎜🎜Vous pouvez passer des pointeurs de fonction en tant que paramètres à d'autres fonctions : 🎜rrreee🎜La fonction ci-dessus call_function reçoit un pointeur de fonction func, qui pointe vers Une fonction qui prend deux entiers et renvoie un entier. 🎜🎜🎜Appel d'un pointeur de fonction🎜🎜🎜Pour appeler une fonction pointée par un pointeur de fonction, il faut utiliser l'opérateur pointeur (*) : 🎜rrreee🎜🎜Cas pratique🎜🎜🎜Considérez le ordre suivant à l'aide de pointeurs de fonction Exemple de tableau : 🎜rrreee🎜Dans l'exemple ci-dessus, nous définissons trois fonctions de comparaison : 🎜
  • compare : fonction de comparaison décroissante
  • Greater_than : fonction de comparaison ascendante (en utilisant le pointeur de fonction)
  • [](int a, int b) { return a < b ; function (Utilisation d'expressions lambda)
🎜La fonction sort prend un pointeur de fonction comme paramètre et trie le tableau en fonction de la fonction de comparaison spécifiée. Cet exemple montre comment utiliser des pointeurs de fonction pour basculer facilement entre différents algorithmes de tri. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn