1.由类外指向类内的指针
声明格式:
类型符 类名::*指针名=类中数据成员地址描述;
使用方法:
类所定义的对象名.指针名
#include<iostream>
class A
{
public:
int i,*p;
A(){i=10;p=&i;}
};
int A::*p=&A::i; //p是类外指针
void main()
{
A aa,bb;
(bb.*p)++; //括号不能缺,否则编译器理解为非法操作
-- *aa.p;
cout<<"AA:"<<aa.*p<<"BB:"<<bb.*p<<"\n";
cout<<"AA:"<<*aa.p<<"BB:"<<*bb.p<<endl;
}
Result:
AA:9 BB:11
AA:9 BB:11
注:所指成员只能声明具有public属性。
2.类外指向成员函数的指针数据
声明格式:
类型符(类名::*指针名)=&类名::函数名;
注:所指成员只能声明具有public属性。
#include<iostream>
class A
{
int i;
public:
int set(int k)
{i=++k;return i;}
};
void main()
{
int (A::*f)(int)=&A::set;
A aa;
cout<<(aa.*f)(10)<<endl;
}
Result:
11
3.指向类内静态成员的指针
静态成员由于可与对象分离,唯一地存放于公用的全局区中,所以指向静态成员的指针就简化了。
与上面的指针不同之处在于:
• C++语言不检查静态成员处于何处(实际上全放在全局数据区)
• 必须在全局区用“数据类型 类名::静态变量名[=...];”的格式开指明其作用域或初值。
#include<iostream>
class A
{
static int i;
friend class B;
public:
static void set(int k){i=k;i++;}
};
class B
{
public:
static void ds(int l)
{
int *p=&A::i;
cout<<*p<<"\n";
*p=l;
cout<<*p;
}
};
int A::i=0; //静态数据成员初始化
void (*f1)(int)=&A::set;
void (*f2)(int)=&B::ds;
void main(){
f1(10);
f2(20);
}
Result:
11
20