普通函数指针定义
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
为避免复杂的指针类型,使用typedef
2 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;