C++中的指针(二)函数指针_第1页
C++中的指针(二)函数指针_第2页
C++中的指针(二)函数指针_第3页
C++中的指针(二)函数指针_第4页
C++中的指针(二)函数指针_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++中的指针(二)函数指针对于任何函数voidprint(strings),它的指针这样定义:

void(*pfun)(string)=NULL;

pfun=

或者pfun=print;两种写法没有区分。

pfun是指针变量名。可以指向任何只带一个string参数,返回void的函数。这里让它指向print()函数。

以后调用它的时候直接写

if(pfun)

pfun(“Helloworld“);

C++编译器会通过pfun找到print函数,然后callprint(“Helloworld“);

一个简洁应用是可以作菜单操作。例如在文本模式下的界面,让用户选择如下操作:

“0.print,1.copy,2.delete,3.quit,4.help“

那么可以写5个函数:

voidprint();

voidcopy();

voiddelete();

voidquit();

voidhelp();

然后用一个函数指针数组把他们存在一起:

void(*p[])()={print,copy,delete,quit,help};

然后依据用户入0,1,2,3,4来直接叫函数

cin>>index;

p[index]();

在windows环境下编译这种函数指针被认为是用C/C++呼叫规章(C/C++callingconvention)。就是呼叫函数caller清理函数呼叫时生成的stack。另一种规章叫标准呼叫规章(standardcallingconvention)。由被叫函数callee清理自己的stack。二者一般状况下区分不大,但standardcallingconvention更合理,由于这样使函数size变小了一点。

实际上写C/C++函数指针的时候省略了__cdecl前缀。应当写成void(__decel*p[])();

而标准标准用__stdcall前缀。也可以用宏CALLBACK,这也就是的回调函数了。

使用CALLBACK的另一个好处就是呼叫函数(caller)不需要详细关怀被叫函数(callee)是什么而直接呼叫。例如我们要写一个排序函数。可以用各种不同算法。如冒泡法。

voidCALLBACKBubbleSort(int*pStart,int*pEnd);

也可以用quicksort

voidCALLBACKQuickSort(int*pStart,int*pEnd);

那么呼叫方只需要定义一个指向这种格式的函数指针:

void(CALLBACK*p)(int*,int*),然后让p指向想用的函数就可以了。

这里只对int类型排序,实际上这种排序函数可以再叫一个CALLBACK函数来打算排序规章。以使算法可以应用到各种不同类型的变量以及不同的排序规章中。在各算法书上都有介绍。假如大家有兴趣,我可以写一下这个排序函数。

另一个典型的例子是MFC中Timer使用的CALLBACK函数,每当TimerExprie的时候会去叫这个函数,依据返回值打算下一个动作。

C++中的函数指针与C的不同

classC

{

public:

booltest();

}

这里指向print的指针不是bool*p(),而是bool(C::*p)();

呼叫这个函数的时候这样写:

Cc,*pc=

bool(C::*p)()=

c.*p();

或者pc->*p();

赋值那行bool(C::*p)()=在VS2022里右边可以省去C::,到了VS2022语法更严格了,被制止了。这里的成员函数指针对非静态函数有效。静态函数不依靠于任何object,它的表示方法和C的一样。

对于非静态成员函数的指针的继承关系是这样的:upcast合法,downcast不合法。这样的到的指针永久是安全的。

非静态成员函数指针在实际程序中的应用许多。一个典型的例子是用来写statemachine(状态机器?)。例如程序在掌握一个机器人的初始化阶段。整个初始化需要三个函数:1。初始化机器人的身子,2。初始化机器的左手,3。初始化机器人的右手。这样我们在statemachine中用两个成员函数指针分别指向当前的状态和下一个状态bool(CStateMachine::*m_pCurrentState),bool(CStateMachine::*m_pNextState)。。

一开头永久叫Start()

CStateMachine::CStateMachine

{

m_pCurrentState=CStateMachine::Start;

}

然后在每一个State里

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论