« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
| 公告 |
☆★☆★☆★☆★☆★☆ 生活的点点记录,以及一些体会...........
喜欢是淡淡的爱,爱是深深的喜欢.
时间会见证一切.......................
欢迎大家指出错误,共同进步..........
期待中..............................
☆★☆★☆★☆★☆★☆ |
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作为第一个参数,供所属类的所有对象共享.因此成员函数的地址实际上就是这些全局函数的地址. |
|
回复:函数指针 软件技术
joshua.li(游客)发表评论于2005/11/15 16:41:00 |
|
回复:函数指针 软件技术
jzhang(游客)发表评论于2005/7/13 16:12:40 |
|
» 1 »
|