1. Pointeurs de fonction
Les fonctions sont stockées dans la zone de code de la mémoire, et elles ont aussi des adresses. Si nous avons une fonctionint test(int a), alors son adresse est le nom de la fonction. C'est exactement comme pour un tableau, où le nom du tableau est l'adresse de début du tableau.
1.1 Définition des pointeurs de fonction
data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn);
Par exemple :
int (*fp)(int a); // 这里就定义了一个指向函数(这个函数参数仅仅为一个 int 类型,函数返回值是 int 类型)的指针 fp.
Exemple
Remarque :La fonction pointée par un pointeur de fonction doit avoir le même type de retour, le même nombre de paramètres et les mêmes types de paramètres.
1.2 L’utilisation de typedef peut simplifier la définition des pointeurs de fonction
Exemple
1.3 Les pointeurs de fonction peuvent aussi être passés comme arguments à des fonctions
Exemple
En exécutant le code ci-dessus, la sortie est :
10
1.4 En utilisant des pointeurs de fonction, nous pouvons construire un tableau de pointeurs de fonction, plus précisément un tableau de pointeurs vers des fonctions
Exemple
2. Pointeurs de fonction pointant vers des fonctions membres de classe
Définition :Un pointeur de fonction membre de classe est un type de données pointeur dans le langage C++, utilisé pour stocker des informations d'accès pour une fonction membre d'une classe spécifiée qui a une liste de paramètres et un type de retour donnés.
Essentiellement, il y a deux points à noter :
- 1. Lors de l'affectation d'un pointeur de fonction, vous devez utiliser&
- 2. Utilisez.*(objet d'instance) ou->*(pointeur d'objet d'instance) pour appeler la fonction pointée par le pointeur de fonction membre de classe.
Regardons deux exemples ci-dessous :
A) Pointeurs de fonction membre de classe pointant vers des fonctions membres non statiques dans une classe
Pour unefonction membre non statique, prendre son adresse permet d'obtenir l'adresse réelle de la fonction en mémoire.
Pour unefonction virtuelle, son adresse est inconnue au moment de la compilation, donc pour une fonction membre virtuelle, prendre son adresse ne peut obtenir qu'une valeur d'index.
Exemple
En exécutant le code ci-dessus, la sortie est :
A::set(): 0x8048a38 B::print(): 0x1 B::print(): 0x5 A: 0 A: 10 A: 100 A: 1000 A: 10000
B) Pointeurs de fonctions membres de classe pointant vers des fonctions membres statiques dans une classe
Exemple
Résumé
Les pointeurs de fonction membre de classe et les pointeurs de fonction ordinaires ne sont pas la même chose. Les premiers doivent utiliser.*et ->*opérateur pour les utiliser, tandis que les seconds peuvent utiliser*opérateur (appelé "déréférencement", ou "indirection").
Les pointeurs de fonction ordinaires stockent en fait l'adresse de début du corps de la fonction, c'est pourquoi on les appelle aussi "pointeurs de code", pour les distinguer des pointeurs de données les plus couramment utilisés en C/C++.
Les pointeurs de fonction membre de classe, cependant, ne sont pas simplement l'adresse mémoire de début de la fonction membre de classe ; ils doivent aussi résoudre le problème d'ajustement de l'adresse de l'instance de classe causé par l'héritage multiple et l'héritage virtuel de C++. Par conséquent, lors de l'appel d'un pointeur de fonction membre de classe, un objet instance de classe doit être passé.
Adresse d'origine : https://blog.csdn.net/crayondeng/article/details/16868351