指针在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中将不同的函数地址赋给该指针,再用指针进行函数调用,最后输出计算结果。
效果如下: