C语言中的函数指针还是很简单的,这里还是稍微总结一下:
- 函数地址:
函数名,&函数名,两者均可。 - 函数指针变量的定义方法:
把函数名替换为你喜欢的变量名,并在前面加*号,并把*号和函数名()起来。 - 函数指针类型的定义方法:
把上一步的变量名替换为你喜欢的类型名,前面再直接加typedef即可。
例子:
(1) 函数定义如下:
char *parseFrame(char* frame, int len);
(2) 定义一个函数指针变量pFunc指向parseFrame这个函数:
char *(*pFunc)(char* frame, int len);
pFunc = parseFrame;
(3) 定义一个函数指针类型ParseFunc,并用这个类型定义一个函数指针变量pFunc,指向parseFrame这个函数:
typedef char *(*ParseFunc)(char* frame, int len);
ParseFunc pFunc;
pFunc = parseFrame;
在C++中,要想写一个指向成员函数的函数指针,以上知识就不够用了。
- 成员函数地址为:
&类名::成员函数名,与上面的C语言风格相比,这里必须要加&符号。 - 指向成员函数的函数指针变量的定义方法:
把函数名替换为你喜欢的变量名,前加上【类名::*】,并把【类名::*变量名】用()括起来。 - 指向成员函数的函数指针类型的定义方法:
把上一步的变量名替换成你喜欢的类型名,并在前面加typedef。
例子:
(1)定义成员函数readAge:
class Person
{
public :
int readAge(void);
}
(2)定义函数指针变量pFunc指向readAge函数:
int (Person::*pFunc)(void);
pFunc = &Person::readAge;
(3)定义函数指针类型Person::ReadFunc,并用这个类型定义一个函数指针变量pFunc ,指向readAge这个成员函数
typedef int (Person::*ReadFunc)(void);
Person::ReadFunc pFunc = &Person::readAge;
类型名也可不带类名前缀,简写为:ReadFunc pFunc = &Person::readAge;
(4)在本类的别的成员函数中通过函数指针变量pFunc ,调起readAge这个成员函数
Person::ReadFunc pFunc = &Person::readAge;
int a = (this->*pFunc)();
(5)在类外,通过函数指针, 调起这个成员函数
Person tom;
Person::ReadFunc pFunc = &Person::readAge;
int a = (tom.*pFunc)();
(6)常见编译错误:
由上面(4/5)两点可见,用函数指针调起成员函数,必须要有对象操作,具体来说就是体现为【this->】或者【obj.】或者【pObj->】,而不能像C语言一样,直接用函数指针调用,例如上面第(4)条,如果按C语言的方法来写:
Person::ReadFunc pFunc = &Person::readAge;
int a =pFunc();//这一行按照C语言语法来看,没毛病,但在C++中编译报错
编译错误提示为:error: C2064: 项不会计算为接受 xx 个参数的函数。(博主注:xx等于你传入的实参数目)
这个编译错误对程序员来说,过于隐晦,让人不明所以,感觉驴头不对马嘴,这里特意记录一下。