C++基础 学习笔记三:函数指针
什么是函数指针
函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C/C++在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
注:函数指针和指针函数并非同等事物,指针函数指的是返回值是指针的函数
函数指针的声明方法
-
普通函数指针
返回值类型 ( * 指针变量名) ([形参列表]);
-
成员函数指针
-
静态成员函数指针
返回值类型 (*指针变量名)([形参列表]);
-
成员函数指针
返回值类型 (类名::*指针变量名)([形参列表]);
-
函数指针的使用例子
#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) = ÷
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
请按任意键继续. . .
*/