指向类数据成员、类成员函数的指针

成员指针

成员指针是指可以指向类的非静态成员的指针,一般情况下指针指向一个对象,但是成员指针指示的是类的成员,而非类的对象,类的静态成员不属于任何对象,因此无须特殊的指向静态成员的指针,指向静态成员的指针与普通指针没有什么区别,成员指针的类型囊括了类的类型以及成员的类型,当初始化一个这样的指针时,我们令其指向类的某个成员,但是不指定该成员所属的对象,直到使用成员指针时,才提供成员所属的对象

指向类数据成员的指针

指向非静态数据成员:Type class::*p = &class::meb;  

指向静态数据成员:Type *p = &class::meb;

指向类成员函数的指针

指向非静态成员函数:Type (class::*p)(...) = &class::func;

指向静态成员函数:Type (*p)(...) = &class::func;

总结:在定义时不需要用到类对象,在调用时,指向非静态的需要使用对象来调用,指向静态的则不需要使用对象来调用,指向成员函数的指针与普通意义上的指针不一样,它存放的是偏移量。从类的起始地址的偏移量指向非静态成员函数时,必须用类名作限定符,使用时则必须用类的实例来调用。指向静态成员函数时,则不需要使用类名作限定符,使用时也不需要类的实例调用。

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <string>

class A
{
public:
	A(string na) :name(na){}

	static void foo();
 	static int id;
	void func();
	string name;
};

int A::id = 100;

void A::func()
{
	cout << "A::func" << endl;
}

void A::foo()
{
	cout << "A::foo" << endl;
}

int main()
{
	A a("zhaosi");
	A *pa = new A("liming");

	string A::* pn = &A::name;    //非静态
	int *pi = &A::id;			  //静态

	void(A::*pf)() = &A::func;
	void(*pf2)() = &A::foo;

	//此时*pn 相当于一个接口 只要是该类的对象就可以调用
	cout << a.*pn << endl;		  //非静态调用时需要使用对象  
	cout << pa->*pn << endl;
	cout << *pi << endl;

	cout << "======================================" << endl;

	//使用时末尾要加()
	(a.*pf)();
	(pa->*pf)();
	pf2();					   //静态的直接调用

	int* p[10];				   //指针数组
	int(*a1)[10];			   //数组指针
	int(*f)(int);	    	   //函数指针
	void(*fptr[10])();         //函数指针数组
	fptr[0] = &A::foo;		   //静态成员函数指针可以赋值

	void(A:: * ffptr[10])();   //类非静态成员函数指针数组
	ffptr[0] = &A::func;
	(a.*ffptr[0])();		   //调用
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值