zoukankan      html  css  js  c++  java
  • 函数指针

    一、指向普通函数的指针

    要符合两点要求:

    1返回类型相同

    2参数类型、个数、顺序相同

    实例:

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

    int (*pFun)(int a,int b);

    int _tmain(int argc, _TCHAR* argv[])
    {
        pFun = Max;
        cout<<pFun(3,4);

        getchar();
        return 0;
    }

    二、指向类的成员的指针

    1指向类的普通成员函数的指针

    它与指向普通函数的指针相比多了一个条件,即需要匹配该函数指针所属类的类型,这样是因为

    非静态成员函数必须被绑定到一个类的对象和指针上,才能得到被调用对象的this指针,然后才能

    调用指针所指的成员函数(每个类对象都有自己的数据成员拷贝,不过函数是共有的,但是必须有

    this指针才知道是哪个对象调用了)

    实例:

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

    int (A::*pFun)(int a,int b);

    int _tmain(int argc, _TCHAR* argv[])
    {
        pFun = &A::Max;
        A a;
        A *p = new A;

        cout<<(a.*pFun)(3,4)<<endl;   
        cout<<(p->*pFun)(3,4)<<endl;

        getchar();
        return 0;
    }

    2指向静态成员函数的指针

    类的静态成员函数是独立的共有的,不需要this指针和具体的类对象就可以调用

    所以它与普通函数指针一样定义,指示在赋值时需指出是哪个类的函数。

    实例:

    class A
    {
    public:
        int Max(int a,int b)
        {
            return a>b?a:b;
        }
        static void fun()
        {
            cout<<"static fun of a class"<<endl;
        }
    };

    void (*pFun)();

    int _tmain(int argc, _TCHAR* argv[])
    {
        pFun = &A::fun;

        pFun();
        getchar();
        return 0;
    }

    3指向类的数据成员的指针

    只需以下两个判断条件:

            1 数据成员类型

            2 所属的类类型

    它的申明调用赋值方法和前面类似。

    实例:

    class A
    {
    public:
        A():m_nNum(0){};
        int Max(int a,int b)
        {
            return a>b?a:b;
        }
        static void fun()
        {
            cout<<"static fun of a class"<<endl;
        }
        int m_nNum;
    };

    int (A::*pClassMemb);
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        A a;
        A *p = new A;

        pClassMemb = &A::m_nNum;

        cout<<(a.*pClassMemb)<<endl;
        cout<<(p->*pClassMemb)<<endl;
        getchar();
        return 0;
    }

    指向类的静态成员的指针就是普通的指针。

    三、函数指针数组

    函数可以像一般对象一样放在数组里,通过索引取值,包括把函数指针作为函数的参数。

    这个时候用typedef来定义一个别名更容易理解

    void Add()
    {
        cout<<"Add"<<endl;
    }

    void Delete()
    {
        cout<<"Delete"<<endl;
    }

    typedef void (*PFUN)();
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        PFUN fun[3] = {Creat,Add,Delete};

        for (int i = 0;i < 3;i++)
        {
            fun[i]();
        }
        getchar();
        return 0;
    }

    类的实例:

    class A
    {
    public:
        void Creat()
        {
            cout<<"Creat"<<endl;
        }

        void Add()
        {
            cout<<"Add"<<endl;
        }

        void Delete()
        {
            cout<<"Delete"<<endl;
        }
    };

    typedef void (A::*PFUN)();
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        PFUN fun[3] = {&A::Creat,&A::Add,&A::Delete};
        A a;
        A *p = new A;

        for (int i = 0;i < 3;i++)
        {
            (a.*fun[i])();
            (p->*fun[i])();//要注意左边的括号
        }
        getchar();
        return 0;
    }

    生命在于折腾,生活就是如此的丰富多彩
  • 相关阅读:
    报名用户主题看板
    有效线索主题看板 阿善有用 清洗转换具体怎么做
    意向客户主题看板 阿善看到 阿善用到 拉链表
    数据库建模 全量表导入
    git 阿善有用
    IDEA+git+码云
    Cloudera Manager的基本使用 阿善没用
    cloudera manager报错解决方案
    java-多态简述及实例
    java-简述接口及实例
  • 原文地址:https://www.cnblogs.com/Mr-Zhong/p/4138406.html
Copyright © 2011-2022 走看看