本站首页    管理页面    写新日志    退出


«July 2025»
12345
6789101112
13141516171819
20212223242526
2728293031


公告

☆★☆★☆★☆★☆★☆
生活的点点记录,以及一些体会...........

喜欢是淡淡的爱,爱是深深的喜欢.

时间会见证一切.......................

欢迎大家指出错误,共同进步..........

期待中..............................

☆★☆★☆★☆★☆★☆


我的分类(专题)

日志更新

最新评论

留言板

链接

世纪音频

 

 


Blog信息
blog名称:
日志总数:162
评论数量:312
留言数量:0
访问次数:940988
建立时间:2005年5月17日




[读书笔记]函数指针
软件技术

oceanblue 发表于 2005/6/21 14:54:17

在注册一个回调函数时候,我们常常使用函数指针.c++\c的连接器在连接程序的时候必须把函数的调用语句上,因此函数地址必须在编译时就确定下来.也就是编译器为函数生成代码的时候.  typedef int(* FuncPtr)(const char*) 定义一个函数指针的类型     类的成员函数有4种类型:inline,virtual,static,normal.inline函数在运行会展开,虽然语言允许取其地址,但是没有太大的意义.virtual成员函数的地址指的是其在vtable中的位置;static成员函数的地址和普通全局函数的地址没有任何区别;普通成员函数的地址和一般函数的地址也没有区别,就是函数代码在内存中的真实地址,但是由于它的调用要绑定到一个实在实在在的对象身上,因此无论是其函数指针的声明方式还是其地址的获取方式都比较特别.  #include<iostream.h>class CTest{public: void f(void)            //普通成员函数 {  cout<<"CTest::f()"<<endl; } static void g(void)     //静态成员函数 {  cout<<"CTest::g()"<<endl;  } virtual void h(void)    //虚拟的成员函数 {  cout<<"CTest::h()"<<endl; }private:}; void main(){ typedef void (*GFPtr)(void);//定义一个全局函数指针类型 GFPtr fp=CTest::g;//取静态成员函数地址的方法和取一个全局函数的地址相似 fp();//通过函数指针调用类静态成员函数 typedef void (CTest::*MemFuncPtr)(void);//声明类成员函数指针类型 MemFuncPtr mfp_1=&CTest::f;//声明成员函数指针变量并初始化 MemFuncPtr mfp_2=&CTest::h;//注意获得成员函数地址的方法    CTest theObj; (theObj.*mfp_1)();//使用对象和成员函数指针调用成员函数 (theObj.*mfp_2)();    CTest *pTest=&theObj;//使用对象指针和成员函数指针调用成员函数 (pTest->*mfp_1)(); (pTest->*mfp_2)(); }实际上,任何成员函数的代码体都是独立于类的对象而存在的,只是非静态成员函数在调用的时候需要与具体的对象建立绑定关系而已(即this指针),c++\c编译器最终把所有的成员函数经过Name-Mangling的处理后转换全局函数,并且增加一个入参this作为第一个参数,供所属类的所有对象共享.因此成员函数的地址实际上就是这些全局函数的地址.


阅读全文(6398) | 回复(2) | 编辑 | 精华
 


回复:函数指针
软件技术

joshua.li(游客)发表评论于2005/11/15 16:41:00

很好. 少见的好文章.


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:函数指针
软件技术

jzhang(游客)发表评论于2005/7/13 16:12:40

好文章!谢谢

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144777326 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号