类成员的指针 classname::*member, (classname::*pf)()

回顾:

普通函数指针定义
1  int  ( * pfi)()

问题提出:
假设有如下类
1  class  Screen
2  {
3  public :
4       int  height() {  return  _height; }
5       int  width() {  return  _width; }
6  // dot.gif.
7  }

现在这样赋值
1  pfi  =   & Screen::height;
2  // 非法赋值,类型违例

因为指向成员函数指针包含三个方面:1)参数表(个数、类型)  2)返回类型   3) 所属类类型
而普通的指向函数指针只包含两个方面

正确的指向成员函数指针定义:
1  int  (Screen:: * pmf)();
2  pmf  =   & Screen:height;
3 
4 
为避免复杂的指针类型,使用typedef
1  typedef  int  (Screen  * PTR_TYPE)();
2  PTR_TYPE pmf  =   & Screen::height;


注意 classname::* 语法

指向类成员的指针的使用:
 1  int  (Screen:: * pmf)()  =   & Screen::height;
 2  Screen myScreen,  * bufScreen;
 3 
 4  // 直接调用成员函数
 5  if (myScreen.height()  ==  bufScreen -> height())
 6  // dot.gif
 7 
 8  // 通过成员函数指针的等价调用
 9  if ((myScreen. * pmf)()  ==  (bufScreen ->* pmf)())
10  // dot.gif



同样道理,指向数据成员指针:
1  int  Screen:: *  ps_screen  =   & _height


总结:与普通指针比较,加上 classname::*



static成员的指针:
我们知道,静态类成员属于该类的全局对象和函数,它们的指针是普通指针(请记住static成员函数没用this指针)

 1  class  classname
 2  {
 3  public :
 4      static   void  rai( double  incr);
 5      static   double  interest() { };
 6      //
 7  private :
 8      static   double  _interestRate;
 9      string  _owner;
10  }
11 
12  // ok
13  double   * pd  =   & classname::_interestRate;
14  // error
15  double  classname:: * pd  =   & classname::_interestRate;
16 
17  // ok
18  double  ( * pfunc)()  =   & classname::interest;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值