C++ Primer 指向成员函数的指针

来源:互联网 发布:大麦盒子1016提示网络 编辑:程序博客网 时间:2024/06/06 12:54

下面
的pfi 是一个函数指针该函数没有参数返回类型为int
int (*pfi) ();
给出两个全局函数HeightIs()和WidthIs()
int HeightIs();
int WidthIs();
把HeightIs()和WidthIs()中的任何一个或两个赋值给指针pfi 都是合法且正确的
pfi = HeightIs;
pfi = WidthIs;
类Screen 也定义了两个访问函数——height()和width()——它们也没有参数返回类型也
是int
inline int Screen::height() { return _height; }
inline int Screen::width() { return _width; }
但是把height()或width()任何一个赋给指针pfi 都是类型违例都将导致编译时刻错误
// 非法赋值: 类型违例
pfi = &Screen::height;
为什么会出现类型违例呢成员函数有一个非成员函数不具有的属性——它的类its
class 指向成员函数的指针必须与向其赋值的函数类型匹配不是两个而是三个方面都要
匹配1 参数的类型和个数2 返回类型3 它所属的类类型
在成员函数指针和普通函数指针之间的不匹配是由于这两种指针在表示上的区别
函数指针存储函数的地址可以被用来直接调用那个函数关于函数指针在7.9 节讨论
成员函数指针首先必须被绑定在一个对象或者一个指针上才能得到被调用对象的this 指针
然后才调用指针所指的成员函数在。

成员函数指针的声明要求扩展的语法它要考虑类的类型对指向类数据成员的指针也
是这样考虑Screen 类的成员height 的类型它的完整类型是short 型的Screen 类的成
员指向_height 的指针的完整类型是指向short 型的Screen 类的成员的指针这可以
写为
short Screen::*
指向short 型的Screen 类的成员的指针的定义如下
short Screen::*ps_Screen;
ps_Screen 可以用_height 的地址初始化如下
short Screen::*ps_Screen = &Screen::_height;
类似地它也可以用_width 的地址赋值如下
535 第十三章 类
ps_Screen = &Screen::_width;
ps_Screen 可以被设置为_width 和_height 中的任一个因为Screen 的这两数据成员的类
型都是short
在数据成员指针和普通指针之间的不匹配也是由于这两种指针的表示上的区别普通指
针含有引用一个对象所需的全部信息数据成员指针在被用来访问数据成员之前必须先被
绑定到一个对象或指针上。

定义一个成员函数指针需要指定函数返回类型参数表和类例如指向Screen 成员函
数并且能够引用成员函数height()和width()的指针类型如下
int (Screen::*) ()
这种类型指定了一个指向类Screen 的成员函数的指针它没有参数返回值类型为int
指向成员函数的指针可被声明初始化及赋值如下
// 所有指向类成员的指针都可以用0 赋值
int (Screen::*pmf1)() = 0;
int (Screen::*pmf2)() = &Screen::height;
pmf1 = pmf2;
pmf2 = &Screen::width;
使用typedef 可以使成员指针的语法更易读例如下面的类型定义
Screen& ( Screen::* ) ()
也就是指向Screen 类成员函数的一个指针该函数没有参数返回Screen 类对象的引用
它可以被下列typedef 定义Action 所取代
typedef Screen& (Screen::*Action)();
Action default = &Screen::home;
Action next = &Screen::forward;
指向成员函数类型的指针可以被用来声明函数参数和函数返回类型我们也可以为成员
函数类型的参数指定缺省实参例如
Screen& action( Screen&, Action );
action()被声明为有两个参数一个Screen 类对象的引用和一个指向类Screen 的成员
函数的指针该函数没有参数返回Screen 类对象的引用action()可以以下列任意方式被调

Screen myScreen;
typedef Screen& (Screen::*Action)();
Action default = &Screen::home;
extern Screen& action( Screen&, Action = &Screen::display );
void ff()
{
536 第十三章 类
action( myScreen );
action( myScreen, default );
action( myScreen, &Screen::end );
}

 

(详见C++primer 534页)