函数指针

一、指向普通函数的指针

要符合两点要求:

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;
}

posted @ 2014-12-02 20:35  阿木木在发呆  阅读(174)  评论(0编辑  收藏  举报