函数指针
定义方式
typedef 返回值类型(* 新类型名称)(参数列表)
typedef char (*PTRFUN)(int); PTRFUN pFun; char glFun(int a){ return;} void main() { pFun = glFun; (*pFun)(2); }
调用方式:
- 直接把函数指针变量当作函数名,然后填入参数
- 将函数指针的反引用作为函数名,然后填入参数
上面的PTRFUN也可直接进行以下调用:
PTRFUN(2);
函数调用方式
函数名就是函数的地址,是一个编译时的常量,“函数连接”的本质就是把函数地址绑定到函数的调用语句上。
静态连接:一般的函数调用语句可以在编译的时候就完成这个绑定,这就是静态连接。
运行时连接&动态连接:
函数指针可以理解为一个新的类型,由其定义的变量,与其他变量一样,在编译期间是没有值的,因此函数指针与函数体的绑定关系只有到了运行时才确定。
对于函数指针数组,此特征表现的尤为明显,见《高质量程序设计指南》P135
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)(); }
时间: 2024-10-09 22:33:08