一、指向类静态成员的指针
类的静态成员是全局的,定义它们的方法与定义普通指针一样。下面的程序很好地说明了这一点。
class A
{
public :
static void f()
{
cout<<m_data+1<<endl;
}
static int m_data;
};
int A::m_data=10;
void main()
{
int * ip=&A::m_data;
void (*fp)()=&A::f;
cout<<*ip<<endl;
fp();
}
二、指向类非静态成员的指针
先给出一个类定义
class A
{
public:
int i,j;
A(int i,int j):i(i),j(j)
{
}
int func1()
{
return i++;
}
int func2()
{
return j++;
}
};
void main()
{
int A::* ip;
ip=&A::i;
int (A::*fp)();
fp=&A::func1;
A a(1,2);
A * p=new A(3,4);
cout<<a.*ip<<endl;
cout<<p->*ip<<endl;
cout<<(a.*fp)()<<endl;
cout<<(p->*fp)()<<endl;
A b(5,6);
A * q=new A(7,8);
int A::* array1[2]={&A::i,&A::j};
int (A::*array2[2])()={&A::func1,&A::func2};
A b(5,6);
A * q=new A(7,8);
for(int i=0;i<2;i++)
{
cout<<b.*array1[i]<<endl;
cout<<q->*array1[i]<<endl;
}
for(int j=0;j<2;j++)
{
cout<<(b.*array2[j])()<<endl;
cout<<(q->*array2[j])()<<endl;
}
}
1、 定义
a) 指向非静态数据成员的指针
定义指向数据成员的指针时,要在*前加上类名和作用域操作符
例如:int A::* ip;//定义
ip=&A::i;//赋值
b) 指向非静态函数成员的指针
定义指向函数成员的指针时,要在*前加上类名和作用域操作符
例如:int (A::*fp)();//定义
fp=&A::func1;//赋值
2、 使用
类成员的指针必须通过特定的对象或指向类对象的指针来访问,通过使用两个指向成员操作符的指针(针对类对象和引用的.* ,以及针对指向类对象的指针的->*)
例如: A a(1,2);//类对象
A * p=new A(3,4);//类指针
cout<<a.*ip<<endl;//通过对象访问指向类数据成员的指针
cout<<p->*ip<<endl;//通过对象指针访问指向类数据成员的指针
cout<<(a.*fp)()<<endl;//通过对象调用指向类函数成员的指针
cout<<(p->*fp)()<<endl;//通过对象指针调用指向类函数成员的指针
3、 应用
定义指向类数据成员的指针数组
int A::* array1[2]={&A::i,&A::j};
定义指向类函数成员的指针数组
int (A::*array2[2])()={&A::func1,&A::func2};
访问:
A b(5,6);
A * q=new A(7,8);
for(int i=0;i<2;i++)
{
cout<<b.*array1[i]<<endl;
cout<<q->*array1[i]<<endl;
}
for(int j=0;j<2;j++)
{
cout<<(b.*array2[j])()<<endl;
cout<<(q->*array2[j])()<<endl;
}