第一次写技术博客,文章若有错误或是代码不规范,欢迎指正
函数指针:
函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关:
bool (*pf)(const string&,const string&);
这条语句将pf声明为指向函数的指针,它所指向的函数带有两个const string&类型的形参和bool类型的返回值
注意:*pf两侧的圆括号是必须的,否则该条语句声明的是一个函数名为pf,带有两个const string&类型的形参和bool*类型的返回值的函数
1.用typedef简化函数指针的定义
typedef bool (*cmpFcn)(const string&,const string&);
该定义表示cmpFcn是一种指向函数的指针类型的名字,该指针类型为“指向返回bool类型并带有两个const string引用形参的函数的指针”
2.指向函数的指针的初始化和赋值
bool func(const string&,const string&);
对func的任何使用都被解释为如下类型的指针:
bool (*)(const string&,const string&);
初始化及赋值:
cmpFcn pf1 = 0;
cmpFcn pf2 = func;
pf1 = func;
pf2 = pf1;
注意:函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值
3.通过指针调用函数
cmpFcn pf =func;
func("a","b");
pf("a","b");
(*pf)("a","b");
4.函数指针形参
函数的形参可以是指向函数的指针,可以用一下两种方式编写:
void bigger(const string&,const string&,bool(const string&,const string&));
void bigger(const string&,const string&,bool (*)(const string&,const string&));
5.返回指向函数的指针
函数可以返回指向函数的指针,如:
int (*pf(int))(int*,int);
上述语句可以这样理解:将pf声明为一个函数,带有一个int形参,该函数返回int (*)(int*,int),它是一个指向函数的指针,它所指向的函数返回int型并带有两个分别是int*和int类型的形参。
使用typedef可以使这个定义更好理解:
typedef int (*PF)(int*,int);
PF pf(int);
6.指向重载函数的指针
C++语言允许使用函数指针指向重载的函数:
extern void ff(vector<double>);
extern void ff(unsigned int);
void (*pf)(unsigned int) = &ff; //ff(unsigned int)
指针的类型必须与重载函数的某一个版本精确匹配,如果没有能够精确匹配的函数,则对该指针的初始化和赋值均会导致编译失败。
//普通函数(非类成员)的指针范例
#include <iostream>
using namespace std;
namespace Screen
{
int up() { cout << "up" << endl; return 1; }
int down() { cout << "down" << endl; return 1; }
int left() { cout << "left" << endl; return 1; }
int right() { cout << "right" << endl; return 1; }
enum Dir{
UP,
DOWN,
LEFT,
RIGHT
};
typedef int(*pf)();
pf get_func_ptr(Dir cm)
{
pf func = NULL;
switch (cm)
{
case UP:
func = &up;
break;
case DOWN:
func = &down;
break;
case LEFT:
func = &left;
break;
case RIGHT:
func = &right;
break;
}
return func;
}
void move(Dir cm)
{
get_func_ptr(cm)();
}
};
void main()
{
Screen::move(Screen::UP);
Screen::move(Screen::RIGHT);
system("pause");
}
成员函数指针:
成员函数的指针必须在三个方面与它所指向的函数类型相匹配:
(1)函数形参的类型和数目,包括成员是否为const
(2)返回类型
(3)所属类的类型
通过指定函数返回类型、形参表和类定义成员函数的指针,如:
char (Screen::*)() const;
可以像普通函数指针那样定义和初始化:
char (Screen::*pmf)() const = &Screen::get; //char get() const为类Screen的成员函数
也可以使用typedef为成员指针指定类型别名,如:
typdedef char (Screen::*Action)(Screen::index, Screen::index) const;
Action get = &Screen::get;
//类成员函数的指针范例
#include <iostream>
using namespace std;
class Screen
{
public:
Screen& home() { cout << "GO HOME ..." << endl; return *this; }
Screen& forward() { cout << "GO FORWARD ..." << endl; return *this; }
Screen& back() { cout << "GO BACK ..." << endl; return *this; }
Screen& up() { cout << "GO UP ..." << endl; return *this; }
Screen& down() { cout << "GO DOWN ..." << endl; return *this; }
typedef Screen& (Screen::*Action)();
static Action Menu[];
enum Dir{
HOME,
FORWARD,
BACK,
UP,
DOWN
};
Screen& move(Dir cm);
void print();//函数可以声明,却不定义
};
Screen& Screen::move(Dir cm)
{
(this->*Menu[cm])();
return *this;
}
Screen::Action Screen::Menu[] = {
&Screen::home,
&Screen::forward,
&Screen::back,
&Screen::up,
&Screen::down
};
int main()
{
Screen myScreen;
myScreen.move(Screen::HOME);
myScreen.move(Screen::DOWN);
system("pause");
return 0;
}
参考资料:C++ Primer