|  | 
 
| 
本帖最后由 yundi 于 2016-6-29 17:18 编辑
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 先声明,菜鸟学习中的理解,肯定不够准确,欢迎指正。
 
 1.先定义两个函数
 #include <iostream>
 //两个函数
 int fadd(int a,int b){return a+b;}
 int fsub(int a,int b){return a-b;}
 
 
 2.函数指针。把函数名fadd替换成(*fp),就成了函数指针
 void main(void)
 {
 int (*fp) (int ,int );
 fp = fadd;//指向某函数
 std::cout << fp(3,4) << std::endl;
 }
 
 
 3.函数引用。把函数名fadd替换成(&rf),就变成函数引用
 void main(void)
 {
 int (&rf)(int,int)(fadd); //初始化为fadd函数的引用
 std::cout << rf(3,4) << std::endl;
 //rf = fsub; //不能再引用到另一个函数
 system("puase");
 }
 
 引用一旦初始化,就不能再赋值。所以,不能再引用到另一个函数。
 
 
 4.函数指针引用。把函数指针*fp替换为* & rfp,即是函数指针引用
 void main(void)
 {
 int (* &rfp)(int,int)(fp);
 std::cout << rfp(3,4)<<std::endl;
 fp = fsub; //指针可以修改
 std::cout << rfp(3,4)<<std::endl;
 }
 
 是对指针的引用,当指针的指向修改到另一个函数时,就间接引用到另一个函数。
 
 
 5.函数作为参数。设想一种情况,要根据某条件选择调用其中一个函数,可能会这样写:
 int funselect(int num,int a,int b)
 {
 switch(num)
 {
 case 1:return fadd(a,b);//条件1就fadd
 case 2:return fsub(a,b);//条件2就fsub
 default:return 0;
 }
 }
 
 另一个方法就是把函数作为参数传进去
 int funpram(int a,int b,int (fpram)(int,int))
 {
 return fpram(a,b);
 }
 std::cout << funpram(3,4,fadd) << std::endl;   //调用
 
 还有一种是把函数指针作为参数
 int pfunpram(int a,int b,int (* pfpram)(int,int))
 {
 return (* pfpram)(a,b);
 }
 std::cout << pfunpram(3,4,fadd) << std::endl;  //调用
 
 再就是把函数引用作为参数
 int rfunpram(int a,int b,int (& rfpram)(int,int))
 {
 return rfpram(a,b);
 }
 std::cout << rfunpram(3,4,fadd) << std::endl;  //调用
 
 最后把函数指针引用作为参数
 int rpfunpram(int a,int b,int (* & rpfpram)(int,int))
 {
 return * rpfpram(a,b);
 }
 void main(void)
 {
 int (*fp) (int ,int )(fadd); //定义并初始化函数指针,等效 int (* fp) (int,int) = fadd;
 std::cout << rpfunpram(5,5,fp) << std::endl;  //调用
 }
 
 上面仅仅列举了作为参数的几种可能形态,至于之间有什么区别,该如何运用,还有待学习
 
 
 6.继续变形。
 
 返回类型为函数,不带这么玩~
 
 返回类型为函数指针,指向int(*)(int,int)型函数
 int (* retfp())(int,int)
 {
 return fadd;
 }
 void main(void)
 {
 int (*fp) (int ,int ); //定义函数指针变量
 fp = retfp();//调用函数
 std::cout << fp(5,3) << std::endl;  //调用
 }
 
 返回类型为函数引用,引用int()(int,int)型函数
 int (& retrf())(int,int)
 {
 return fsub;
 }
 void main(void)
 {
 int (*rf2) (int ,int ) = retrf(); //定义就必须初始化
 std::cout << rf2(5,3) << std::endl;  //调用
 }
 
 返回类型为函数指针引用 ?
 int (* & retrfp())(int,int)
 {
 //…… ?
 }
 
 
 7.再复杂点。综合5、6,让返回值、参数都和函数指针、函数引用挂上关系。例如:
 int (* z(int x,int(*y)(int)))(int)
 int (* & z(int x,int(* & y)(int)))(int)
 
 ------------以下是练习代码----------
 
 #include <iostream>
 
 int fadd(int a,int b){return a+b;}
 int fsub(int a,int b){return a-b;}
 
 int funselect(int num,int a,int b)
 {
 switch(num)
 {
 case 1:return fadd(a,b);//条件1就fadd
 case 2:return fsub(a,b);//条件2就fsub
 default:return 0;
 }
 }
 //参数是函数
 int funpram(int a,int b,int (fpram)(int,int))
 {
 return fpram(a,b);
 }
 //参数是函数指针
 int pfunpram(int a,int b,int (* pfpram)(int,int))
 {
 return (* pfpram)(a,b);
 }
 //参数是函数引用
 int rfunpram(int a,int b,int (& rfpram)(int,int))
 {
 return rfpram(a,b);
 }
 //参数是函数指针引用
 int rpfunpram(int a,int b,int (* & rpfpram)(int,int))
 {
 return (* rpfpram)(a,b);
 }
 
 //返回值是函数指针,指向int fun(int,int)型函数
 int (* retfp())(int,int)
 {
 return fadd;
 //int (* frel)(int,int) = fadd;
 //return frel;
 }
 
 //返回值是函数引用
 int (& retrf())(int,int)
 {
 return fsub;
 }
 
 //返回值是函数指针引用
 
 void main(void)
 {
 //1.函数指针
 int (*fp) (int ,int );
 fp = fadd;
 std::cout << fp(3,4) << std::endl;
 //2.函数引用
 int (&rf)(int,int)(fadd);
 std::cout << rf(3,4) << std::endl;
 //3.函数指针引用
 int (* &rfp)(int,int)(fp);
 std::cout << rfp(3,4)<<std::endl;
 fp = fsub;
 std::cout << rfp(3,4)<<std::endl;
 
 //4.函数作为参数
 std::cout << funpram(3,4,fadd) << std::endl;
 
 //5.函数指针作为参数
 std::cout << pfunpram(3,4,fadd) << std::endl;
 std::cout << pfunpram(5,4,fsub) << std::endl;
 
 //6.函数引用作为参数
 std::cout << rfunpram(3,4,fadd) << std::endl;
 
 //7.函数指针引用作为参数
 std::cout << rpfunpram(5,5,fp) << std::endl;
 fp = fadd;
 std::cout << rpfunpram(5,5,fp) << std::endl;
 
 //8.返回值是函数指针
 fp = retfp();
 std::cout << fp(5,6) << std::endl;
 
 //9.返回值是函数引用
 int (&rf2)(int,int) = retrf();
 std::cout << rf2(8,9) << std::endl;
 
 //10.返回值是函数指针引用
 
 system("pause");
 }
 
 
 | 
 |