简介
===========================================================================================================
一、指向函数的指针
- 函数指针是指指向函数而非指向对象的指针,像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关;
bool (*pf)(const string &,const string &);
//这个语句将pf 声明为指向函数的指针,它所指向的函数带有两个const string & 类型的形参和bool 类型的返回值。
//指针两边的 圆括号是必须的
1、用typedef 简化函数指针的定义
- 函数指针类型相当地冗长。使用typedef 为指针类型定义同义词,可将函数指针的使用大大简介。
typedef bool (* cmpFcn)(const string &,const string &);
要使用这种函数指针类型时,只需直接使用cmpFcn 即可,不必每次都把整个类型声明全部写出来。
2、指向函数的指针的初始化和赋值
- 在引用函数名但又没有调用该函数时,函数名将自动解释为指向函数的指针。假设有函数:
bool lengthCompare(const string &,const string &);
除了用作函数调用的左操作数以外,对lengthCompare的任何使用都被解释为如下类型的指针;
bool (*)(const string &,const string &);
可使用函数名对函数指针做初始化和赋值:
cmpFcn pf1 = 0; //cmpFcn是一个指向函数的指针类型,所以pf1是一个函数指针,但是还没有绑定到一个函数
cmpFcn pf2 = lengthCompare;//函数指针pf2指向函数lengthCompare,他们的类型完全匹配
pf1=lengthCompare;
pf2=pf1;//可以函数指针之间的赋值
此时,直接引用函数名等效于在函数名上应用取地址操作符:
cmpFcn pf1 = lengthCompare;
cmpFcn pf2 = &lengthCompare;
注意:
函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值。
将函数指针初始化为0 ,表示该指针不指向任何函数。
指向不同函数类型的指针之间不存在转换**
string::size_type sumLength(const string&,const string&);
bool cstringCompare(char*,char*);
cmpFcn pf;//定义了一个函数指针
pf=sumLength;//错误!!!!
pf=cstringCompare;//错误!!!
pf=lengthCompare;//可以,函数指针和函数类型匹配
3、通过指针调用函数
指向函数的指针可用于调用它所指向的函数。可以不需要使用解引用操作符,直接通过指针调用函数:
如果指向函数的指针没有初始化,或者具有0 值,则该指针不能在函数调用中使用。
只有当指针已经初始化,或被赋值为指向某个函数,方能安全地用来调用函数。
cmpFcn pf=lengthCompare;//函数指针pf指向函数lengthCompare
lengthCompare("hi","bye");//函数调用
pf("hi","bye"); //通过函数指针来调用所指向的函数
4、函数指针形参
- 函数的形参可以是指向函数的指针。形参可以用以下两种形式编写:
void useBigger(const string &,const string &,bool(const string &,const string &));
void useBigger(const string &,const string &,bool(*)(const string &,const string &));
5、返回指向函数的指针
函数可以返回指向函数的指针,但是正确写这种返回类型相对不易;
阅读函数指针声明的最佳方法是从声明的名字开始由里而外理解。
允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针,而不是函数。
具有函数类型的形参所对应的实参将被自动转化为指向相应函数类型的指针,但是,当返回的是函数时,同样的转换操作无法实现
(没怎么懂!!!)
int (*ff(int))(int *,int);
//ff(int),将ff声明为一个函数,它带有一个int型的形参。该函数返回 int(*)(int *,int);它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是int * 型和int 型的形参。
使用typedef可使该定义更简明
typedef int (*PF)(int *,int);//PF是一种指向函数的指针类型
PF ff(int); //函数ff的返回类型是函数指针
typedef int func(int *,int);//func是一种函数类型,不是指向函数的指针
void f1(func);//声明了一个函数f1,里面有一个形参是func,是函数类型。函数没有返回类型
func f2(int);//错误!!!因为返回类型是函数类型,形参却是int型
func *f3(int);//可以,函数返回一个指向函数类型的指针
6、指向重载函数的指针
extern void ff(vector<double>);
extern void ff(unsigned int);
void (*pf1)(unsigned int) = &ff;//函数指针pf1 指向函数ff(unsigned)
void (*pf2)(int) = &ff;//错误!!!参数类型不匹配
double (*pf3)(vector<double>); //错误!!!返回类型不匹配
pf3 = &ff;