一、指向普通函数的指针
要符合两点要求:
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;
}