函数指针、类成员指针及其调用

1、类成员变量指针:

//.h 样本类
Class Sample{
private:
	int a;
	int b;
public:
	void show_a() const;
};

可以通过标识符a与类对象来引用实际的内存单元。C++允许定义指向标识符a的成员指针:

int Sample::*pt = &Sample::a;

常规指针指向特定内存单元,pt不是,因为没有指出具体对象,其被设定为与对象标识符一起使用

//.cpp
Sample S1;
Sample* S2 = new Sample;
cout << S1.*pt << endl; //显示int a的值
cout << S2->*pt << endl; //显示int a的值
pt = &Sample::b; //a与b均为int,因此可以修改指向
cout << S1.*pt << endl; //显示int b的值

2、函数指针:
可以编写将一个函数地址作为参数的函数,需要:获取函数地址;声明函数指针;使用函数指针调用函数
a) 获取函数地址:
函数名(后面不跟参数)即为函数地址,例如:

void funca(); //funca 即为函数地址

process(funca); //将函数作为参数传递,必须传递函数名:

b) 声明函数指针:
函数指针应表明指向函数的类型,即包括返回值类型与特征标,如:

double pam(int a);
double (*pt)(int); //pt为函数指针,*pt为函数,(*pt)必须加括号
//若不加括号,则由于()的运算符优先级问题,变为返回指针的函数:
// double* pt (int); 
pt = pam //函数地址赋值给指针

// 给调用函数传参
process(int a,double (pt*) (int)); // 调用函数的原型
process(5,pam); //传递地址

c) 使用函数指针调用函数:
pt为函数指针,调用函数格式如下:

double pam(int a);
double (*pt)(int); //pt为函数指针,*pt为函数,(*pt)必须加括号
pt = pam //函数地址赋值给指针
auto pt2 = pam;
double res = pam(5);
double res2 = (*pt)(5); //也可直接用指针调用:double res2 = pt(5);

d) 函数指针数组

double (*pt[3])(int) = {pam,pam,pam};
double res3 = (*pt[1])(5); 

[]的优先级高于*
pt为第一个元素的地址,&pt为整个数组的地址,虽然在值上相同,但含义不同。pt+1指向下一个元素,&pt+1指向数组后一个位置,与该数组大小相同内存块的地址。

函数指针参考资料:C++ Primer Plus 7.10节

3、类成员函数指针:
声明指向成员函数的指针,必须指出函数所属的类:

void (Sample::*pf) () const; //指向Sample的返回值与参数都为空的const函数,但没有明确表示哪一个函数。
pf = &Sample::show_a; //获取指定函数的地址,与获取普通函数地址不同,需要加&
Sample S3;
(S3.*pf) (); // 必须加括号,指出该表达式是一个函数名。

参考资料:C++ Primer Plus 7.10节与附录E.2

总结:

1、声明类成员指针,不需要指定对象,但使用该指针需要对象来调用。
2、获取类成员函数地址与获取普通函数地址不同,需要加&。
3、普通函数的函数名即为函数地址。
4、[]的优先级高于*

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值