本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第2章,第2.13节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。
C和C++代码精粹如果返调函数是某个类的成员函数将会怎样?获得指向类成员的指针与获得指向非成员实体的指针的方式相似,只存在很小的语法变化。例如,考虑下面类的定义:
class C { public: void f ( ) {cout << "C::f\n";} void g( ) {cout << "C::g\n";} };可以这样定义一个指向C类成员函数的指针:
void (C::*pmf) ( ); // pmf是指向C的成员函数的指针 //不带参数并且没有返回值可以根据需要来初始化pmf使其指向不同的成员函数,如下面的程序所示:
main( ) { C c; void (C::*pmf) ( ) =&C::f; (c.*pmf) ( ); pmf =&C:: g; (c.*pmf) ( ); } //输出: C::f C::g. 运算符调用了代表其左边操作数所指向的对象的成员函数。如果 cp 是一个指向 C 的指针,那么可以使用->运算符,就像:
( cp->*pmf ) ( );由于C++定义运算符优先级的方式,所以圆括号是完全确认所调用的函数所必需的。请参见程序清单2.19(程序清单2.18菜单例子的指向成员函数指针的版本)。
程序清单2.19 举例说明对成员的指针
// menu2.cpp: 使用指向函数成员的指针 #include <iostream> using namespace std; class Object { public: void retrieve() {cout << "Object::retrieve\n";} void insert() {cout << "Object::insert\n";} void update() {cout << "Object::update\n";} void process(int choice); private: typedef void (Object::*Omf)(); static Omf farray[3]; }; Object::Omf Object::farray[3] = { &Object::retrieve, &Object::insert, &Object::update }; void Object::process(int choice) { if (0 <= choice && choice <= 2) (this->*farray[choice])(); } main() { int show_menu(); //你所提供的! Object o; for (;;) { int choice = show_menu(); if (1 <= choice && choice <= 3) o.process(choice-1); else if (choice == 4) break; } }本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
相关资源:编程精粹:编写高质量C语言代码(高清PDF中文版)