C + + function Pointers
A function pointer describes
A function pointer points to a particular type, and the type of the function is determined by its parameters and return type, regardless of the function name. Examples are as follows:
int add (int nleft,int nright);//function definition
The function type is int (int,int), and to declare a pointer to the class function, simply substitute the pointer with the name of the functor:
Int (*PF) (int,int);//Not initialized
The pf can point to a function of type int (int,int) . PF is preceded by a *, which indicates that PF is a pointer, the right side is a formal parameter list, the pf points to a function, the left is an int, and the function returned by PF points to a value of int. The pf can point to a function of type int (int,int) . When the add type is int (int,int), the pf can point to the add function.
PF = add;//The function pointer to a specific function by assigning a value
Note: The brackets at both ends of the *PF are necessary, otherwise defined as follows:
int *PF (int,int);//<span style= "font-family: the song Body;" > At this time <span lang= "en-US" >pf</span> is a function that returns a value of <span lang= "en-US" >int* </span>, not a function pointer. </span>
Two standard C function pointers
1 definition of function pointers
1.1
Int (*PF) (int,int);
1.2
typedef int (*PF) (int,int); PF pf;//<span style= "font-family: Song body; font-size:14pt; Mso-ascii-theme-font:major-fareast; Mso-fareast-theme-font:major-fareast; Mso-hansi-theme-font:major-fareast; " > At this point, <span lang= "en-US" >PF</span> is a function pointer type that points to a type function, rather than a specific pointer, it can be used to define a specific pointer <span lang= "en-US" >pf< /SPAN>. </span>
2 general use of function pointers
PF = add; PF (100,100);//The function used to point to the same (*PF) (100,100);//Here *PF both brackets are necessary
Note: Add The type must exactly match the type of function the pf can point to.
3 function pointers as formal parameters
The second parameter is a function type, which is automatically converted to a pointer to such a function Void fuc (int nvalue,int pf (int,int)); An equivalent declaration that shows a parameter defined as a pointer to a function Void fuc (int nvalue,int (*PF) (Int,int)); Void fuc (int nvalue,pf);
fucfunction Call
PF = ADD;//PF is a function pointer fuc (1,ADD);//add is automatically converted to function pointer fuc (1,PF);
4 returns a pointer to a function
4.1
PF fuc2 (int);//PF as function pointer type
4.2
Description: read this declaration statement in an inward-to-outer order. FUC2 A tangible parameter list, then FUC2 is a function whose formal parameter is fuc2 (int), FUC2 preceded by *, so fuc2 returns a pointer, The pointer itself also contains a formal parameter list (int,int), so the pointer points to the function, and the return value of the function is Int.
Summary:FUC2 is a function that has a parameter of (int) and returns a pointer to a function that points to Int (int,int) .
Two C + + function pointers
1 because C + + is fully compatible with C, the function pointer usages available in C are available for C + +
2c++ Other functions (pointers) definition and use
2.1
typedef decltype (ADD) add2;
decltype returns the function type , ADD2 is the same type of function as add , unlike Add2 , which is a type, not a specific function.
How to use:
<span style= "color: #000000;" > add2* pf;//pf Pointer to the add type, uninitialized </span>
2.2
typedef decltype (ADD) * Pf2;//<span lang= "en-US" style= "font-family: Song body; Font-size: 14pt; Mso-ascii-theme-font:major-fareast; Mso-fareast-theme-font:major-fareast; Mso-hansi-theme-font:major-fareast; " ><span style= "Mso-spacerun:yes;" > </span>pf2</span><span style= "font-family: Song body; font-size:14pt; Mso-ascii-theme-font:major-fareast; Mso-fareast-theme-font:major-fareast; Mso-hansi-theme-font:major-fareast; " > <span lang= "en-US" >1.1</span> <span lang= "en-us" >PF</span> same meaning </span><span Style= "font-family: Song body; font-size:14px;" ></span>
<span style= "font-family: Song body; font-size:14pt; Mso-ascii-theme-font:major-fareast; Mso-fareast-theme-font:major-fareast; Mso-hansi-theme-font:major-fareast; " ><span lang= "en-US" >pf2 pf;//pf</span> pointer to <span lang= "en-us" >add</span> type function pointer, uninitialized </ Span><span style= "font-family: Song body; font-size:14px;" > </span>
2.3
Auto PF = ADD;//PF can be considered an alias of add (personal understanding) Auto *PF = ADD;//PF is a pointer to add
3 function Pointer parameter
typedef decltype (add) add2; typedef decltype (ADD) * PF2; void Fuc2 (add2 add);//function parameter, call is automatically converted to function pointer void FUC2 (PF2 add);//function pointer parameter, passing in the corresponding function (pointer) can be
4returns a pointer to a function
4.1
Auto Fuc2 (int), int (*) (int,int)//<span lang= "en-US" style= "font-family: Song body; font-size:14pt; Mso-ascii-theme-font:major-fareast; Mso-fareast-theme-font:major-fareast; Mso-hansi-theme-font:major-fareast; " >fuc2</span><span style= "font-family: Song body; font-size:14pt; Mso-ascii-theme-font:major-fareast; Mso-fareast-theme-font:major-fareast; Mso-hansi-theme-font:major-fareast; " > Return function pointer to <span lang= "en-US" >int (*) (Int,int) </span></span>
4.2
Decltype (ADD) * FUC2 (int)//explicitly know which function to return, use the Decltype keyword to infer its function type,
5 member function Pointers
5.1 Normal member function pointer
Class a//defines classes a{private: int Add (int nleft, int nright) { return (nleft + nright); } Public: void fuc () { printf ("Hello world\n")} }; typedef void (A::* PF1) ();//The name of the pointer must be preceded by A class name qualification PF1 PF1 = &A::fuc; Must have &a a;//member function address dereference must be attached to an object address, so you must create a formation (A.*PF1) ();//Use the member function pointer to call the function
5.2 function pointers in inheritance
Class A{public: void fuc () { printf ("Hello fuc () \ n"); } void Fuc2 () { printf ("Hello a::fuc2 () \ n"); }}; Class B:public A{public: virtual void fuc2 () { printf ("Hello b::fuc2 () \ n"); }}; typedef void (A::* PF1) (), typedef void (B::* PF2) (); PF1 PF1 = &a::fuc;int Main () { a A; b b; (A.*PF1) (); Call A::fuc (B.*PF1) (); Call A::fuc PF1 = &A::fuc2; (A.*PF1) (); Call A::fuc2 (B.*PF1) (); Call A::fuc2 PF2 pf2 = &A::fuc2; (B.*PF2) (); Call A::FUC2}
6 pointers to overloaded functions
Void fuc (); Void fuc (int); void (*PF) (int) = FUC;//PF points to fuc (int) int (*PF2) (int) = fuc;//error no matching type
The compiler chooses that function by its pointer type, and the pointer type must match exactly one of the overloaded functions.
A summary of the C + + function pointer usage