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

//通过成员函数名获取成员函数的指针的时候,一定要注意加&;

//使用成员函数指针调用某个成员函数的时候,一定要指明该成员函数目前针对的操作对象,也就是类的实例,
//具体的方法就是(obj->*mem_ptr)();

#include <stdio.h>
#include <stdlib.h>

class FuncPointer{
public:
    void TestFunc1(){
        printf("call TestFunc1\n");

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

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

    static void TestFunc3(){
        printf("call TestFunc3\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\n");
}

int main(int argc, char *argv[]){
    G_Fun fun1 = &FuncPointer::TestFunc3;
    fun1();

    //G_Fun fun2 = &FuncPointer::TestFunc1; //编译错误,不能将void (__thiscall 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();   //编译错误,对成员函数指针的调用要指明一个实例对象
    FuncPointer *fp = new FuncPointer();
    (fp->*fun7)();

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

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

    system("pause");
    return 0;
}

从上面的代码可以看出在使用成员函数指针的时候要注意一下的几个方面

  1. 不管是在类的内部还是在类的外部定义成员函数指针,格式必须为:

    typedef RetType(ClassName::*MFun)(params...);   //成员函数指针类型声明
    MFun m_Fun; //成员函数指针定义
  2. 成员函数指针的取地址符&并不是所有的编译器都需要的,但是考虑到移植性最好要加上

  3. 可以对函数指针进行分类,如下图所示:

    函数指针分类
    静态成员函数相当于普通函数,可以用普通函数指针指向。但是普通成员函数不能用普通函数指针指向。

  4. 成员函数指针的调用一定要借用类实例。这个类实例用来初始化成员函数的this指针

    注意成员函数指针的作用域,(instance->*(instance_scope->m_func))()
    其中instance用来初始化this指针,同时要求instance_scope中有个一成员变量m_func。
    这个成员变量是一个成员函数指针,指向instance所属类中的某个非静态成员函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值