这篇文章主要介绍“C++程序的函数指针实际操作介绍”,在日常操作中,相信很多人在C++程序的函数指针实际操作介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++程序的函数指针实际操作介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
先看看这段代码:
#includeusing std::cout;using std::endl; inline int min(int a,int b){return (a>b) ? b : a;} int Min(int a,int b,int (*pf)(int,int))//可以使用缺省参数:int Min(int a,int b,int (*pf)(int,int)=min){return pf(a,b); //通过函数指针来调用函数,也可以写为 //return (*pf)(a,b);作用是一样的。} int main(int argc, char* argv[]){int i=1;int j=10; int r=Min(i,j,min); //如果使用缺省参数的话,可以写成:int r=Min(i,j);cout<<1r<1<1endl;return 0;}
其中int (*pf)(int,int)定义了一个返回值为int,参数为两个int的函数指针。如果不在*pf上加括号的话,即:
int *pf(int,int),
编译器会把它解释为一个返回值为整型指针,参数为两个int的函数。
可以用typedef来简化代码:
#includeusing std::cout;using std::endl;typedef int (*PF)(int,int);//这行代码是关键,相当与把上个例子中的函数指针声明为一种数据类型。 inline int min(int a,int b){return (a>b) ? b : a;}int Min(int a,int b,PF f) //PF f定义f为和上个例子中一样的函数指针。{return f(a,b);}int main(int argc, char* argv[]){int i=1;int j=10;int r=Min(i,j,min);cout<<1r<1<1endl;return 0;}
也可以提供一个用模板实现的函数指针:
#includeusing std::cout;using std::endl;inline int min(int a,int b){return (a>b) ? b : a;}templateT Min(T a,T b,T (*pf)(T,T)){return pf(a,b);}int main(int argc, char* argv[]){int i=1;int j=10;int r=Min(i,j,min); //int r=Min(i,j,min); 这种形式编译器会报错:Expression syntaxcout<<1r<1<1endl;return 0;}
当然,这个指针指向的函数也可用模板来实现:
#includeusing std::cout;using std::endl; templateinline T min(T a,T b){return (a>b) ? b : a;}templateT Min(T a,T b,T (*pf)(T,T)){return pf(a,b);}int main(int argc, char* argv[]){long i=2000000;long j=1000000;//使用时有三种形式:long r=Min(i,j,min);//第一种。注意这里在min后一定要加,否则编译器将报错://Could not find a match for "Min(long,long,T(*)(T,T)"//第二种:long r=Min(i,j,min);//第三种:long r=Min(i,j,min);//其实质是一样的。cout<<1r<1<1endl;return 0;}
不过我不能用typedef使代码更为简便,就像下面这种形式:
template
typedef T (*PF)(T,T);
编译器会提示:Templates must be classes or functions
另外还可以使用函数指针的数组:
#includeusing std::cout;using std::endl;inline int min(int a,int b){return (a>b) ? b : a;}inline int max(int a,int b){return (a>b) ? a : b;}int main(int argc, char* argv[]){int i=1;int j=10; int (*pf[2])(int,int);//拥有两个元素的函数指针数组,每个元素是返回值为int,参数为两个int的函数指针。pf[0]=min;pf[1]=max; int r1=pf[0](i,j);int r2=pf[1](i,j);cout<<1r1<1<1endl;cout<1<1r2<1<1endl;return 0;}
指向重载函数的指针也是值得注意的:#include using std::cout;using std::endl;
inline void print(int a){ cout<<1a<1<1endl;}inline void="" print(long="" b){="" cout<1<1b<1<1endl;}int main(int argc, char* argv[]){ int i=1; long m=100000; void (*pf1)(int)=print; void (*pf2)(long)=print; pf1(i); pf2(m);
return 0;}程序运行的很成功。因为编译器会自动查找所有的重载函数,以找到和函数指针指向的函数具有相同的返回类型和参数表的函数。
如上我们可知声明一个给定函数的函数指针的一般规则:即这个函数指针的返回类型和参数表必须和给定的函数相同。要注意省略号也是函数类型的一部分,int function1(int,...)与int function2(int)需要两个不同的函数指针。其实函数名就是指向该函数的指针,对于int function(int)来说,function就是它的指针。我们可用这个特性对函数指针进行初始化:int (*pf)(int)=function;
取地址操作符也可以用在函数名上,上面的代码和int (*pf)(int)=&function的作用是一样的。
到此,关于“C++程序的函数指针实际操作介绍”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!