一个小的C++函数指针示例

1. 编程题概况

作为对我的另一篇文章 <<C/C++函数指针基础讲解>> 的补充, 这里再给一个短小的C++函数指针的使用示例, 本程序是C++ primer plus第七章第10道编程题.

原文如下:

设计一个名为calculate的函数, 它接受两个double值和一个指向函数的指针, 而被指向的函数接受两个参数,并返回一个double值.calculate函数的类型也是double, 并返回被指向的函数使用calculate的两个double参数计算得到的值.

后面略...

使用函数指针的一些注意事项这里不再重复, 这里程序运行结果是当用户输入两个数字后, 通过循环访问函数指针数组中不同的函数指针调用各个不同运算函数进行计算, 即输入两个数展示所有运算结果. 

2. 代码实现

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

/*类型别名定义pftype为一个函数指针类型*/
/*这种pftype类型的指针指向一个函数,该函*/
/*数接受两个double参数,并返回一个double*/
/*后面pftype就是这种函数指针类型的别名*/
typedef double (*pftype)(double, double);

/*加法运算*/
double add(double, double);
/*减法运算*/
double subtrac(double, double);
/*乘法运算*/
double multica(double, double);
/*除法运算*/
double divisible(double, double);
/*和的平方运算*/
double perfectSquares_sum(double, double);
/*差的平方运算*/
double perfectSquares_diff(double, double);
/*计算函数*/
double calculate(double, double, pftype);

int main()
{
	double a, b, result, tempa, tempb;
	a = b = result = tempa = tempb = 0;
	const int count = 6;
	/*存放操作符*/
	char opch[6] = { 
		'+', '-', '*', '/', 's', 'd'
	};
	/*声明一个函数指针数组pf,其中每一个元素都是一个*/
	/*函数指针, 并用各种运算函数初始化*/
    /*每一个函数名称就是一个函数地址常量被用来初始化*/
	pftype pf[count] = {
		add,     
		subtrac,
		multica,
		divisible,
		perfectSquares_sum,
		perfectSquares_diff
	};
		
	while (1)
	{
		/*获取输入*/
		cout << "Enter two numbers (0 to quit): ";
		cin >> a >> b;
		if (!cin) /*检查输入*/
		{
			cin.clear(); /*输入非法后要重置cin输入状态标记*/
			while (cin.get() != '\n');
			cout << "Bad input, please enter two number!\n";
			continue;
		}
		else if (a == 0 || b == 0) /*如果有0输入直接退出*/
			break;
		while (cin.get() != '\n'); /*输入正确后清除多余字符*/

		/*打印运算结果*/
		cout << "\n ########## Result ########## \n";
		for (int i = 0; i < count; i++)
		{
			/*这里通过访问函数指针数组pf不同的元素调用不同*/
			/*的计算函数来完成运算*/
			result = calculate(a, b, pf[i]);
			cout << a << " " << opch[i] << " " 
			<< b << " = " << result << endl;	
		}
	}
	cout << "\nDone.\n";
	return 0;
}

/*加法运算*/
double add(double x, double y) { return x + y; }

/*减法运算*/
double subtrac(double x, double y) { return x - y; }

/*乘法运算*/
double multica(double x, double y) { return x * y; }

/*除法运算*/
double divisible(double x, double y) { return x / y; }

/*和的平方运算*/
double perfectSquares_sum(double x, double y)
{
	return (x + y) * (x + y);
}

/*差的平方运算*/
double perfectSquares_diff(double x, double y)
{
	return (x - y) * (x - y);
}

/*计算函数*/
/*这里p是一个形参, 它是一个函数指针, 通过给calculate*/
/*传递不同的函数指针数组元素,即不同的函数,达到用p调用*/
/*不同的函数的效果*/
double calculate(double x, double y, double (*p)(double, double))
{
	return (*p)(x, y);
}

运行结果:

32caea4e19aa4227991bf4f166e4e33d.jpeg

3. 结语

希望本文章对您理解函数指针有帮助, 喜欢就点赞收藏, 您的点赞收藏是我创作的动力, 谢谢.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值