理解C++成员函数指针

一直以来对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))()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值