一般函数指针和类成员函数指针(转)

转载 2013年12月03日 23:11:15

转载地址http://www.cnblogs.com/xianyunhe/archive/2011/11/26/2264709.html


函数指针是通过指向函数的指针间接调用函数。函数指针可以实现对参数类型、参数顺序、返回值都相同的函数进行封装,是多态的一种实现方式。由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。

1、指向一般函数的指针

函数指针的声明中就包括了函数的参数类型、顺序和返回值,只能把相匹配的函数地址赋值给函数指针。为了封装同类型的函数,可以把函数指针作为通用接口函数的参数,并通过函数指针来间接调用所封装的函数。

下面是一个指向函数的指针使用的例子。


#include <iostream.h>

/*指向函数的指针*/
typedef int (*pFun)(int, int);

int Max(int a, int b)
{
    return a > b ? a : b;
}

int Min(int a, int b)
{
    return a < b ? a : b;
}

/*通用接口函数,实现对其他函数的封装*/
int Result(pFun fun, int a, int b)
{
    return (*fun)(a, b);
}

void main()
{
    int a = 3;
    int b = 4;

    cout<<"Test function pointer: "<<endl;
    cout<<"The maximum number between a and b is "<<Result(Max, a, b)<<endl;
    cout<<"The minimum number between a and b is "<<Result(Min, a, b)<<endl;
}

2、指向类的成员函数的指针

类的静态成员函数采用与一般函数指针相同的调用方式,而受this指针的影响,类的非静态成员函数与一般函数指针是不兼容的。而且,不同类的this指针是不一样的,因此,指向不同类的非静态成员函数的指针也是不兼容的。指向类的非静态成员函数的指针,在声明时就需要添加类名。

下面是一个指向类的成员函数的指针的使用的例子,包括指向静态和非静态成员函数的指针的使用。


#include <iostream.h>
    
    class CA;
    
    /*指向类的非静态成员函数的指针*/
    typedef int (CA::*pClassFun)(int, int);
    
    /*指向一般函数的指针*/
    typedef int (*pGeneralFun)(int, int);
    
    class CA
    {
    public:
    
        int Max(int a, int b)
        {
            return a > b ? a : b;
        }
        
        int Min(int a, int b)
        {
            return a < b ? a : b;
        }
    
        static int Sum(int a, int b)
        {
            return a + b;
        }
    
        /*类内部的接口函数,实现对类的非静态成员函数的封装*/
        int Result(pClassFun fun, int a, int b)
        {
            return (this->*fun)(a, b);
        }
    
    };
    
    /*类外部的接口函数,实现对类的非静态成员函数的封装*/
    int Result(CA* pA, pClassFun fun, int a, int b)
    {
        return (pA->*fun)(a, b);
    }
    
    /*类外部的接口函数,实现对类的静态成员函数的封装*/
    int GeneralResult(pGeneralFun fun, int a, int b)
    {
        return (*fun)(a, b);
    }
    
    
    void main()
    {
        CA ca;
        int a = 3;
        int b = 4;
        
        cout<<"Test nonstatic member function pointer from member function:"<<endl;
        cout<<"The maximum number between a and b is "<<ca.Result(CA::Max, a, b)<<endl;
        cout<<"The minimum number between a and b is "<<ca.Result(CA::Min, a, b)<<endl;
    
        cout<<endl;
        cout<<"Test nonstatic member function pointer from external function:"<<endl;
        cout<<"The maximum number between a and b is "<<Result(&ca, CA::Max, a, b)<<endl;
        cout<<"The minimum number between a and b is "<<Result(&ca, CA::Min, a, b)<<endl;
    
        cout<<endl;
        cout<<"Test static member function pointer: "<<endl;
        cout<<"The sum of a and b is "<<GeneralResult(CA::Sum, a, b)<<endl;
    }



SQL SERVER 和ACCESS/excel的数据导入导出

SQL SERVER 和ACCESS/excel的数据导入导出常规的数据导入导出: 使用DTS向导迁移你的Access数据到SQL Server,你可以使用这些步骤:   1)在SQL SERVER企...
  • SafeF8
  • SafeF8
  • 2006年04月20日 16:03
  • 4772

网络编程 — 浅析I/O多路转接select技术

认识并编写I/O多路转接之select服务器 说到select服务器首先提到I/O多路转接,我们就不得不提及I/O的5种工作模式,再然后我们就不得不再提及I/O是什么了? I/O是...
  • Dawn_sf
  • Dawn_sf
  • 2017年08月03日 21:40
  • 788

C++类成员函数指针2

  • 2012年11月17日 16:54
  • 4KB
  • 下载

c++ 成员函数指针

  • 2010年04月11日 11:39
  • 9KB
  • 下载

类的成员函数指针(比较深入)

From:http://blog.csdn.net/hairetz/archive/2009/05/06/4153252.aspx 个人感觉对于类的成员函数指针这块讲解的比较深入详细 推荐阅读 ...

类成员函数指针(维基百科)

类成员函数指针[编辑] 维基百科,自由的百科全书 类成员函数指针(member function pointer),是C++语言的一类指针数据类型,用于存储一个指定类具有给...

类的成员函数指针(比较深入)

From:http://blog.csdn.net/hairetz/archive/2009/05/06/4153252.aspx个人感觉对于类的成员函数指针这块讲解的比较深入详细推荐阅读//////...

C/C++开发语言系列之---C++类成员函数指针

http://blog.csdn.net/maojudong/article/details/8194143

成员函数指针 还有std::function之类

遇到了一个需要在公用类里取得其他类的对像
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一般函数指针和类成员函数指针(转)
举报原因:
原因补充:

(最多只允许输入30个字)