C++基础 学习笔记三:函数指针

C++基础 学习笔记三:函数指针

什么是函数指针

函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C/C++在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

注:函数指针和指针函数并非同等事物,指针函数指的是返回值是指针的函数

函数指针的声明方法

  1. 普通函数指针

    返回值类型 ( * 指针变量名) ([形参列表]);

  2. 成员函数指针

    1. 静态成员函数指针

      返回值类型 (*指针变量名)([形参列表]);

    2. 成员函数指针

      返回值类型 (类名::*指针变量名)([形参列表]);

函数指针的使用例子

#include<iostream>

using namespace std;

class Calculator
{
	public:
		Calculator(const double leftArg, const double rightArg, const char C_operator) : 
		left(leftArg), right(rightArg), oper(C_operator)
		{
		}
		double getResult()
		{
			switch(oper)
			{
				case '+':
					return (this->*functionList1[0])(left,right);//成员函数指针数组的例子 
					break;
				case '-':
					return calculate(sub);//成员函数指针作为参数的例子 
					break;
				case '*':
					return functionList2[0](left,right);//静态成员函数指针数组的例子 
					break;
				case '/':
					return DIV(left,right);//静态成员函数指针的例子(普通函数指针的用法和此处一样) 
					break;
				default:
					return (this->*OPERATORERROR)();//成员函数指针的例子
					break;
			}
			return 0;
		}
	private:
		double calculate(double (Calculator::*functionSub)(const double, const double))
		{
			return (this->*functionSub)(left,right);
		}
		double add(const double leftArg, const double rightArg)
		{
			return leftArg+rightArg;
		}
		double sub(const double leftArg, const double rightArg)
		{
			return leftArg-rightArg;
		}
		static double mul(const double leftArg, const double rightArg)
		{
			return leftArg*rightArg;
		}
		static double div(const double leftArg, const double rightArg)
		{
			if(leftArg == 0)
				return -1;
			return leftArg/rightArg;
		}
		double operatorError()
		{
			cout << "operatorError" << endl;
			return 0;
		}
	private:
		double left = 0;
		double right = 0;
		char oper;
		double (Calculator::*functionList1[1])(const double, const double) = {add};
		double (*functionList2[1])(const double, const double) = {mul};
		double (*DIV)(const double, const double) = &div;
		double (Calculator::*OPERATORERROR)() = &operatorError;
}; 

int main()
{
	Calculator add(8,4,'+');
	cout << add.getResult() << endl;
	Calculator sub(8,4,'-');
	cout << sub.getResult() << endl;
	Calculator mul(8,4,'*');
	cout << mul.getResult() << endl;
	Calculator div(8,4,'/');
	cout << div.getResult() << endl;
	Calculator error(8,4,'.');
	cout << error.getResult() << endl;
    return 0;
}
/* 运行结果为: 
12
4
32
2
operatorError
0

--------------------------------
Process exited after 0.09482 seconds with return value 0
请按任意键继续. . .
*/ 
posted @ 2020-04-20 23:17  渣渣灰AKA  阅读(74)  评论(0编辑  收藏