指向类成员的指针

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值