理解C++成员函数指针

转载 2011年11月11日 09:52:33

一直以来对C++成员函数指针没有太注意, 以为跟普通函数指针差不多,  使用起来才发现错误多多,  将成员函数指定当普通函数指针来使用了,  因此, 特意写了个小例子来帮助理解, 具体代码如下:

view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
class FuncPointer   
{   
public:   
    void TestFunc1()   
    {   
        printf("call TestFunc1\r\n");   
  
        m_Fun = FuncPointer::TestFunc2;   
        (this->*m_Fun)();   
    }   
  
    void TestFunc2()   
    {   
        printf("call TestFunc2:\r\n");   
    }   
  
    static void TestFunc3()   
    {   
        printf("call TestFunc3:\r\n");   
    }   
public:   
    typedef void (*Fun)();   
    typedef void (FuncPointer::*MFun)();   
    MFun    m_Fun;   
};   
  
class FuncPointer1   
{   
public:   
    typedef void (FuncPointer::*MFun)();   
    MFun    m_Fun;   
};   
  
typedef void (*G_Fun)();   
void G_TestFun()   
{   
    printf("call G_TestFun:\r\n");   
}   
  
int _tmain(int argc, _TCHAR* argv[])   
{   
    // 调用静态函数   
    G_Fun fun1 = &FuncPointer::TestFunc3;  // &符号可以不加   
    fun1();   
  
    // 调用非静态函数   
    //G_Fun fun2 = &FuncPointer::TestFunc1; // 编译失败, 不能将void (FuncPointer::* )(void)转换为G_Fun   
  
    //FuncPointer::Fun fun3 = &FuncPointer::TestFunc1; // 无法从void (__thiscall FuncPointer::* )(void)”转换为“FuncPointer::Fun   
  
    FuncPointer::Fun fun4 = FuncPointer::TestFunc3;   
    fun4();   
  
    FuncPointer::Fun fun5 = G_TestFun;   
    fun5();   
  
    //FuncPointer::MFun fun6 = G_TestFun; // 无法从"void (__cdecl *)(void)"转换为"FuncPointer::MFun"   
    FuncPointer::MFun fun7 = FuncPointer::TestFunc1;   
    //fun7();                               // 项不会计算为接受 0 个参数的函数   
    FuncPointer* fp = new FuncPointer();   
    (fp->*fun7)();                           // fp->(*fun7)() 出错   
  
    fp->m_Fun = FuncPointer::TestFunc2;   
    //(fp->*m_Fun)();                        // m_Fun未声明   
    (fp->*(fp->m_Fun))();   
  
    FuncPointer1* fp1 = new FuncPointer1();   
    fp1->m_Fun = FuncPointer::TestFunc2;   
    (fp->*(fp1->m_Fun))();   
  
    return 0;   
}  
class FuncPointer
{
public:
 void TestFunc1()
 {
  printf("call TestFunc1\r\n");

  m_Fun = FuncPointer::TestFunc2;
  (this->*m_Fun)();
 }

 void TestFunc2()
 {
  printf("call TestFunc2:\r\n");
 }

 static void TestFunc3()
 {
  printf("call TestFunc3:\r\n");
 }
public:
 typedef void (*Fun)();
 typedef void (FuncPointer::*MFun)();
 MFun m_Fun;
};

class FuncPointer1
{
public:
 typedef void (FuncPointer::*MFun)();
 MFun m_Fun;
};

typedef void (*G_Fun)();
void G_TestFun()
{
 printf("call G_TestFun:\r\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
 // 调用静态函数
 G_Fun fun1 = &FuncPointer::TestFunc3;  // &符号可以不加
 fun1();

 // 调用非静态函数
 //G_Fun fun2 = &FuncPointer::TestFunc1; // 编译失败, 不能将void (FuncPointer::* )(void)转换为G_Fun

 //FuncPointer::Fun fun3 = &FuncPointer::TestFunc1; // 无法从void (__thiscall FuncPointer::* )(void)”转换为“FuncPointer::Fun

 FuncPointer::Fun fun4 = FuncPointer::TestFunc3;
 fun4();

 FuncPointer::Fun fun5 = G_TestFun;
 fun5();

 //FuncPointer::MFun fun6 = G_TestFun; // 无法从"void (__cdecl *)(void)"转换为"FuncPointer::MFun"
 FuncPointer::MFun fun7 = FuncPointer::TestFunc1;
 //fun7();        // 项不会计算为接受 0 个参数的函数
 FuncPointer* fp = new FuncPointer();
 (fp->*fun7)();       // fp->(*fun7)() 出错

 fp->m_Fun = FuncPointer::TestFunc2;
 //(fp->*m_Fun)();      // m_Fun未声明
 (fp->*(fp->m_Fun))();

 FuncPointer1* fp1 = new FuncPointer1();
 fp1->m_Fun = FuncPointer::TestFunc2;
 (fp->*(fp1->m_Fun))();

 return 0;
}

从代码可以看出成员函数指针使用需注意以下几个方面:

1. 不管是在类中或外部定义, 必须为 (class::*fun)(param...) 格式, 否则为一般的函数指针

2. 函数指针的取地址符&可有可无

3. 静态成员函数相当于普通函数, 可用于普通函数指针, 而普通成员函数则不能

4. 成员函数指针的调用一定需要借用类实例来完成

5. 类实例不能直接调用自己内部定义的成员函数指针, 调用方式: (instanse->*(instanse->m_fun))()

C++ ---------------- 成员函数指针揭秘

1 前言 2 语法 3 与其它语言机制的混合使用 3.1 继承 3.2 虚函数 3.2 多继承 4 实现 4.1 Microsoft的实现 4.1.1 内部表示 4.1.2 Vcal...
  • ym19860303
  • ym19860303
  • 2013年02月18日 10:32
  • 1155

C++中类成员函数指针的继承

C++中的成员函数指针(member function pointer)提供了对类成员函数进行动态访问的机制。比如定义如下的类: class Base { public:      void base...
  • socrates
  • socrates
  • 2007年12月26日 15:13
  • 1290

成员函数指针和其他类型的强制转换,使用一般指针调用成员函数

 成员函数指针和其他类型之间的转换,参见如下示例:class test...{public:    void t()...{};};typedef   void   (test::*pMemFncti...
  • jixingzhong
  • jixingzhong
  • 2007年11月09日 12:42
  • 3198

深入探索C++对象模型之指向成员函数的指针

#include using namespace std; class A{ public: virtual int f(int a){ cout
  • gettogetto
  • gettogetto
  • 2016年10月17日 21:33
  • 164

理解C++成员函数指针

成员函数定义, 赋值, 调用方式及注意事项
  • study_live
  • study_live
  • 2010年09月06日 09:19
  • 766

类的非静态成员函数指针详解

From:http://blog.csdn.net/hairetz/archive/2009/05/06/4153252.aspx 个人感觉对于类的成员函数指针这块讲解的比较深入详细 推荐阅读 ///...
  • fuyunzhishang1
  • fuyunzhishang1
  • 2015年09月11日 14:02
  • 852

C++学习之普通函数指针与成员函数指针

函数指针(function pointer)是通过指向函数的指针间接调用函数。相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生。我最近也被问到了这方面的问题,心中...
  • lisong694767315
  • lisong694767315
  • 2014年08月03日 01:10
  • 2385

C++类的成员函数指针与普通的函数指针用法

1.类成员函数指针调用           注意:如果在类内调用,则函数指针声明要放在类里面.如果是类外调用,则函数指针声明放在调用类中. CFunCall.h文件: class CFunCall...
  • lyz769109884
  • lyz769109884
  • 2016年10月28日 15:54
  • 1889

成员函数指针:(结构+与普通函数指针之间的转换)

通过网上查找发现: zailinux
  • liaoyoujinb
  • liaoyoujinb
  • 2014年07月19日 17:18
  • 989

C++模板编程->成员函数指针模板参数

class some_value; typename int (some_value::*some_value_mfp)(int); template int call(some_value &val...
  • sunboyiris
  • sunboyiris
  • 2014年04月05日 14:02
  • 868
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解C++成员函数指针
举报原因:
原因补充:

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