您的位置:首页 > 其它

类成员变量和成员函数的地址

2010-10-26 09:51 309 查看
class 指向成员函数的指针必须与向其赋值的函数类型匹配不是两个而是三个方面都要匹配
参数的类型和个数
返回类型
它所属的类类型
做下面的一个测试
#include<iostream>  using namespace std;  class A  {  public:  	A(int);  	void fun1();  	virtual void fun2();  	static void fun3();  	int num1;  	static int num2;  };  A::A(int i)  {  	num1=i;  }  void A::fun1()  {  	cout<<"I am in fun1"<<endl;  }  void A::fun2()  {  	cout<<"I am in fun2"<<endl;  }  void A::fun3()  {  	cout<<"I am in fun3"<<endl;  }  int A::num2=1;  void main()  {  	A a(2);  	//获取静态成员数据的地址  	int *ptr_static=&A::num2;  	cout<<"静态成员数据的地址"<<ptr_static<<endl;  	ptr_static=&a.num2;  	cout<<"a.num2静态成员数据的地址"<<ptr_static<<endl;  	//获取静态函数的地址  	void (*ptr_staticfun)=A::fun3;  	cout<<"静态成员函数的地址"<<ptr_staticfun<<endl;  	ptr_staticfun=a.fun3;  	cout<<"a.fun3静态成员函数的地址"<<ptr_staticfun<<endl;  	//获取普通成员函数的地址  	typedef void (A::*ptr_commomfun)();  	ptr_commomfun ptr=A::fun1;  	cout<<"普通成员函数的地址"<<ptr<<endl;  //如果直接输出ptr的话,输出来的是1,因此应该把ptr地址中的内容读出来  	cout<<"普通成员函数的地址"<<*((long*)&ptr)<<endl;  	ptr=a.fun1;  	cout<<"a.fun1普通成员函数的地址"<<*((long*)&ptr)<<endl;  	ptr_commomfun ptr_virtual=A::fun2;  //获取虚函数的地址  	cout<<"虚成员函数的地址"<<*((long*)&ptr_virtual)<<endl;  	ptr_virtual=a.fun2;  	cout<<"a.fun2虚成员函数的地址"<<*((long*)&ptr_virtual)<<endl;    	int *p;  	int A::*q;  	q=&A::num1;  	//指向数据成员的指针赋予的是一个目前还不存在的一个类成员的地址,而这个地址只有在使用实际类对象进行调用时才会真正的确定下来  	//就是说在类还没有对象时候,成员变量时没有空间的。  	cout<<"普通成员数据的地址"<<*((long *)&q)<<endl;  	p=&a.num1;  	cout<<"a.num2普通成员数据的地址"<<p<<endl;  }

注意在获取类成员函数的时候,如果直接把指针输出来,得到的是1,我想是因为编译器把&A::fun1当做bool变量
void (A::*ptr)();
ptr=A::fun1;或者ptr=&A::fun1都可以

另外需要注意的是
指向数据成员的指针赋予的是一个目前还不存在的一个类成员的地址,而这个地址只有在使用实际类对象进行调用时才会真正的确定下来
就是说在类还没有对象时候,成员变量时没有空间的

运行结果



本文出自 “xiesiyuana的博客” 博客,请务必保留此出处http://seanyxie.blog.51cto.com/1319339/1375958
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐