理解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++ 成员函数指针

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

C++类成员函数指针2

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

理解C++成员函数指针--草稿未完成

//通过成员函数名获取成员函数的指针的时候,一定要注意加&;//使用成员函数指针调用某个成员函数的时候,一定要指明该成员函数目前针对的操作对象,也就是类的实例, //具体的方法就是(obj->*mem...
  • cromma
  • cromma
  • 2016年04月14日 11:43
  • 295

为什么 C++ 中成员函数指针是 16 字节?

当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小。例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录: Pus...
  • hazir
  • hazir
  • 2014年12月09日 22:37
  • 1098

C++模板实现事件处理器中的“通用成员函数指针”的调用(一)

我最近在实现一个事件处理器,应用到了一种“通用成员函数指针的注册”,先声明,这个名词是我给起的,不过我觉得并不充分恰当,但也想不出什么更好的词,看完下面的介绍,也考考您,看这玩意叫个啥比较合适。 ...

成员函数指针与高性能的C++委托

成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针。这一点对C++来说是不幸的,因为面向对象的 指针(也叫做"闭包(closure...

成员函数指针与高性能的C++委托

Member Function Pointers and the Fastest Possible C++ Delegates   撰文:Don Clugston 翻译:周翔   引子 标...

C++成员函数指针的应用

原文出处:http://www.cppblog.com/colys/archive/2011/06/07/25785.htmlC++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用...

C++成员函数指针与其应用场景

//成员函数指针 #include using namespace std; //全局函数 void test (){ cout
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解C++成员函数指针
举报原因:
原因补充:

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