关于C++函数指针、函数回调的相关总结(重载与多态)

#include <iostream>
using namespace std;
void PrintPass (int nScore)
{ cout<<"分数是:"<<nScore<<"恭喜你通过考试"<<endl;
}


void PrintFailed (int nScore)
{ cout<<"分数是:"<<nScore<<"没有通过考试"<<endl;
}
void PrintExcellent (int nScore)
{ cout<<"分数是:"<<nScore<<"你真厉害"<<endl;
}


/*int main()
{
int nScore=22;
if(nScore<60)
{ PrintFailed(nScore);
}
else if(nScore>=60&&nScore<100)
{PrintPass(nScore);
}
else{ PrintExcellent(nScore);
}
return 0;
}*/


/*int main()
{
int nScore=22; */
//定义函数指针,实现函数指针调用
/*
    函数指针就是指向函数的指针变量,实质就是内存地址,不过函数指针变量指向的不是普通的数据变量内存地址
而是指向一个函数。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的内存地址,函数名就代表
这个入口地址。    
语法格式: 函数返回值类型标志符  (指针变量名)  (形参列表)
函数返回值类型标志符=这个指针所要指向的函数的返回值类型
指针变量名=函数指针变量名
形参列表=指针变量指向的函数所带的参数列表
由于()的优先级高于* 所以指针变量名外的括号必不可少
例如这么一个函数  void PrintPass (int nScore);
声明一个函数指针指向这个函数 void (*pPrintFunc) (int nScore);
即声明一个可以指向PrintPass()函数指针pPrintFunc.当声明函数指针时,参数列表中的形式可有可无。
即 void (*pPrintFunc) (int) 


如果要定义多个同一类型的指针,可使用typedef关键字定义一种新的函数指针的数据类型,用这种新的数据类型
定义函数指针
typedef void(*PRINTFUNC) (int);
PRINTFUNC pFuncFailed;
PRINTFUNC pFuncPass;
这里就定义一种新的函数指针类型PRINTFUNC 它表示这种函数指针类型可以指向一个参数int,返回值void的函数
我们发现函数指针的声明跟他要指向函数的声明非常相似,函数的返回值和参数列表都相同,只是把函数名换成
指针形式。实质上:函数名就是函数的指针。
完成函数指针的声明后,就可以用函数名给函数指针赋值,让它指向这个函数。
pPrintFunc=PrintPass;


或者不用typedef而用auto关键字来声明函数指针类型,编译器会自动判断
auto pPrintFunc=PrintPass


*/
/* void(*pPrintFunc)(int);
if(nScore<60)

pPrintFunc=PrintFailed;
}
else if(nScore>=60&&nScore<100)
{
pPrintFunc=PrintPass;
}
else{ 
pPrintFunc=PrintExcellent;
}
//最后以统一函数指针形式调用函数,因为一个函数指针被不同函数入口地址赋值,从而实现不同函数调用。
(*pPrintFunc) (nScore );
return 0;
}
*/
 /*
   函数回调:在某个函数中,通过函数指针调用另外一个函数,而这个函数指针,在大多数情况下是
   通过函数参数传递进来的。
   如果把函数的指针作为参数传递给另一个函数,那么当这个函数指针用于调用它所向的函数时称之为函数回调
   回调函数可以把主调函数(插口)和被调函数(插头)分开,让程序变得简单。通过改变插入的插头,改变
   主调函数的功能。
   */
//定义函数指针类型
typedef void(*PRINTFUNC) (int);
//统一的打印消息
void PrintMessage(int nScore, PRINTFUNC pFunc)
{
cout<<"==================="<<endl;
(*pFunc)(nScore);
cout<<"+++++++++++++++++++"<<ends;
}


    int main()
    { int nScore=22;
PRINTFUNC pFunc;

if(nScore<60)

pFunc=PrintFailed;
}
else if(nScore>=60&&nScore<100)
{
pFunc=PrintPass;
}
else{ 
pFunc=PrintExcellent;
}
PrintMessage(nScore,pFunc);
return 0;


     }


/*
通过PrintMessage()函数定义一个通用算法框架:首先打印页眉;然后通过函数指针回调函数,打印具体消息;
最后打印页脚。
打印具体消息留给回调函数负责,相当于留下一个插口,等待某个具体的回调函数插头的插入。在主函数中,
通过给PrintMessage()函数传递不同的打印函数的指针。
不同函数指针插头的插入可以改变PrintMessage()函数中的回调函数,进而改变PrintMessage()函数行为,
以其达到对其行为进行自定义的效果。
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值