《C和C++代码精粹》——2.13 指向成员函数的指针

简介:

本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第2章,第2.13节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.13 指向成员函数的指针

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;  
    }  
}

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
16天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
50 0
|
2月前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
62 4
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
140 4
|
3月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
3月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
3月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
3月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
3月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
73 1
|
3月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
54 2
|
3月前
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
30 3