C++primer第五版 函数指针

指针在c++中既是重点又是难点,最开始学指针的时候就已经很绕了,然后接触函数指针的时候,就彻底晕了。很多书在编写函数指针这一块时讲得并不清楚,这里推荐一篇总结函数指针还不错的博客,可以学习一下

https://www.cnblogs.com/zrtqsk/p/4254765.html

函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型,函数的类型由它的返回类型和形参类型共同决定,与函数名无关。

这里,我先以C++primer第五版6.7节的几个练习为例编写代码熟悉函数指针的使用。具体要求如下:

1. 编写函数的声明,令其接受两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。
2. 编写4个函数,分别对两个int值执行加、减、乘、除运算,在创建的vector对象中保存指向这些函数的指针。
3. 调用vector对象中的每个元素并输出其结果。

先附上代码

// primer_6_7.cpp : Defines the entry point for the application.
// 编写函数的声明,令其接受两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。
// 编写4个函数,分别对两个int值执行加、减、乘、除运算,在创建的vector对象中保存指向这些函数的指针。
// 调用vector对象中的每个元素并输出其结果。

#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;

int main()
{
	typedef int(PF)(int,int);  //使用类型别名,将PF定义成函数类型
	PF *result;  //显式地指定返回类型是指向函数的指针
	int fun_add(int,int);  //函数声明,对两个int值执行加法运算
	int fun_sub(int,int);  //函数声明,对两个int值执行减法运算
	int fun_multi(int,int);  //函数声明,对两个int值执行乘法运算
	int fun_div(int,int);  //函数声明,对两个int值执行除法运算
	vector<int> vec;  //声明一个vector对象
	int flag=1;  //让用户选择是否继续计算而定义的一个标志
	int temp;  //保存计算结果的变量
	int num_a,num_b;  //用户输入的两个数
	while(flag)  //flag为1意味着用户希望继续计算,为0意味着用户希望退出
	{
		cout << "input two numbers: " << endl;  //让用户输入两个数
		cin >> num_a >> num_b;
		cout << "choose a operation: (a b c d)" << endl;  //让用户选择进行哪种操作
		cout << "(a) add\t(b) substraction" << endl;
		cout << "(c) multiplication\t(d) divide" << endl;
		char choose;
		cin >> choose;
		switch(choose)  //对不同的选择进行不同的操作
		{
		case 'a':
			result=fun_add;
			temp=result(num_a,num_b);
			vec.push_back(temp);
			cout << num_a << " + " << num_b << " = " << *(vec.end()-1) << endl; 
                         //输出结果,*(vec.end()-1)表示vec容器中最后添加进来的值
			break;
		case 'b':
			result=fun_sub;
			temp=result(num_a,num_b);
			vec.push_back(temp);
			cout << num_a << " - " << num_b << " = " << *(vec.end()-1) << endl;
			break;
		case 'c':
			result=fun_multi;
			temp=result(num_a,num_b);
			vec.push_back(temp);
			cout << num_a << " * " << num_b << " = " << *(vec.end()-1) << endl;
			break;
		case 'd':
			result=fun_div;
			temp=result(num_a,num_b);
			vec.push_back(temp);
			cout << num_a << " / " << num_b << " = " << *(vec.end()-1) << endl;
			break;
		}
		cout << "go on?  y or n" << endl;  //让用户选择是否继续计算
		char y_or_n;
		cin >> y_or_n;
		if(y_or_n=='y')
			flag=1;
		if(y_or_n=='n')
			flag=0;
	}
	system("pause");
	return 0;
}
//定义加、减、乘、除函数
int fun_add(int a,int b)
{
	return (a+b);
}
int fun_sub(int a,int b)
{
	return a-b;
}
int fun_multi(int a,int b)
{
	return a*b;
}
int fun_div(int a,int b)
{
	return a/b;
}

为了与用户的交互性更好,我打印出了加、减、乘、除四种数学运算的操作选项让用户选择一种操作;然后还定义了一个标志变量flag,让用户选择继续计算或者退出计算。这些考虑是为了让程序更实用,但是本篇博客的根本目的还是联系函数指针的使用哈。

首先看下面一行代码

typedef int(PF)(int,int);  //使用类型别名,将PF定义成函数类型

这里是使用类型别名,定义一个函数类型

PF *result;  //显式地指定返回类型是指向函数的指针

这里定义一个函数指针

然后根据用户选择的操作,在case中将不同的函数地址赋给该指针,再用指针进行函数调用,最后输出计算结果。

效果如下:

猜你喜欢

转载自blog.csdn.net/elma_tww/article/details/82888430