C++成员函数指针的定义与使用

2023-11-08

成员函数指针是相对于对象来说的,在说成员函数指针之前,先要明白普通函数指针的定义与使用。
用vs先建立一个项目,名称随意,然后在源文件中声明并且定义一个函数,代码如下:

#include "pch.h"
#include <iostream>
using namespace std;
int add(int a,int b) {
	return a + b;
}

int main()
{
}

可以看到定义的一个求和函数

int add(int a,int b);

然后再入口函数main里面定义一个指向此函数的函数指针。

int (*fp)(int ,int);
fp=add;
cout<<fp(10,11)<<endl;

上面这段代码就是定义一个函数指针,注意函数指针fp的返回值int 对应add的返回值int,然后紧接着就是(*fp)表示他是一个指针,后面跟上形参(int,int)表示它指向一个函数,也就是函数指针,然后我们将add的地址赋值给fp,然后调用fp(10,11),同时在标准输出流中打印。这就是普通的函数指针。这里要注意(*fp)这个小括号不能省略,省略了就不是函数指针了。
你也可以这样定义函数指针

#include "pch.h"
#include <iostream>
using namespace std;
int add(int a,int b) {
	return a + b;
}

int main()
{
	typedef int(*FP)(int, int);
	FP p=add;
	cout << p(10, 11) << endl;

}

首先用typedef关键字定义一个函数指针类型,然后初始化一个此类型的变量,并将add函数的地址赋值给它,然后调用打印。效果是一样的。
说完了普通函数指针,我们再说下成员函数指针。

#include "pch.h"
#include <iostream>
using namespace std;
class Man
{
public:
	void speak();
};
void Man::speak() {
	cout << "I am a man" << endl;
}

int main()
{
	void (Man::*p)();
	p = &Man::speak;
	Man man;
	(man.*p)();
}

这里我们先定义一个类,接着在类里面声明一个方法speak并且实现它(这里我在类的外部实现了,也可以在类内部直接实现)然后,定义一个类里面的成员函数指针,void(Man::*p)();这一句定义成员函数指针需要注意必须要明月是在那个类里面的函数,然后void 表示指向的函数的返回类型,后面()表示形参列表不需要传参,然后把Man::speak函数地址赋值给p,然后再调用,注意这里必须要有一个类的实例才能调用此函数指针。而且格式为
(*man.*p)()后面()表示执行函数的意思。
如果声明的是Man指针,也可以这样调用

int main()
{
	void (Man::*p)();
	p = &Man::speak;
	Man* man = new Man();
	(*man.*p)();
}

注:由于解引用的优先级大于成员选择优先级(* 大于.*)所以不用小括号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++成员函数指针的定义与使用 的相关文章