类成员的指针 classname::*member, (classname::*pf)()
回顾:
普通函数指针定义
问题提出:
假设有如下类
现在这样赋值
因为指向成员函数指针包含三个方面:1)参数表(个数、类型) 2)返回类型 3) 所属类类型
而普通的指向函数指针只包含两个方面
正确的指向成员函数指针定义:
注意classname::* 语法
指向类成员的指针的使用:
同样道理,指向数据成员指针:
总结:与普通指针比较,加上classname::*
static成员的指针:
我们知道,静态类成员属于该类的全局对象和函数,它们的指针是普通指针(请记住static成员函数没用this指针)
普通函数指针定义
1 int (*pfi)()
问题提出:
假设有如下类
1 class Screen
2 {
3 public:
4 int height() { return _height; }
5 int width() { return _width; }
6 //.
7 }
2 {
3 public:
4 int height() { return _height; }
5 int width() { return _width; }
6 //.
7 }
现在这样赋值
1 pfi = &Screen::height;
2 //非法赋值,类型违例
2 //非法赋值,类型违例
因为指向成员函数指针包含三个方面:1)参数表(个数、类型) 2)返回类型 3) 所属类类型
而普通的指向函数指针只包含两个方面
正确的指向成员函数指针定义:
1 int (Screen::*pmf)();
2 pmf = &Screen:height;
3
4
为避免复杂的指针类型,使用typedef2 pmf = &Screen:height;
3
4
1 typedef int (Screen *PTR_TYPE)();
2 PTR_TYPE pmf = &Screen::height;
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 //
7
8 //通过成员函数指针的等价调用
9 if((myScreen.*pmf)() == (bufScreen->*pmf)())
10 //
2 Screen myScreen, *bufScreen;
3
4 //直接调用成员函数
5 if(myScreen.height() == bufScreen->height())
6 //
7
8 //通过成员函数指针的等价调用
9 if((myScreen.*pmf)() == (bufScreen->*pmf)())
10 //
同样道理,指向数据成员指针:
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;
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;