C++的函数指针和成员函数指针

第一次写技术博客,文章若有错误或是代码不规范,欢迎指正微笑


函数指针:

函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关:

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 






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值