回顾:

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

问题提出:
假设有如下类
1 class Screen
2 {
3 public:
4     int height() { return _height; }
5     int width() { return _width; }
6 //类成员的指针 classname::*member,  (classname::*pf)().
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 //类成员的指针 classname::*member,  (classname::*pf)()
 7 
 8 //通过成员函数指针的等价调用
 9 if((myScreen.*pmf)() == (bufScreen->*pmf)())
10 //类成员的指针 classname::*member,  (classname::*pf)()



同样道理,指向数据成员指针:
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;

相关文章:

  • 2021-11-22
  • 2022-02-01
  • 2021-12-20
  • 2022-12-23
  • 2022-12-23
  • 2022-01-02
猜你喜欢
  • 2021-08-08
  • 2022-12-23
  • 2021-10-10
  • 2022-12-23
  • 2021-06-19
  • 2021-11-19
  • 2022-12-23
相关资源
相似解决方案