c++介绍函数指针 十
指针代表内存中地址标识符,变量,数组都是存储内存中的数据。所以可以获得它们的地址,用指针来表示这块内存。
如图输出内存中的地址。
对于一个函数来说,也是内存中存储这段数据,所以我们也可以获取函数的地址。
函数指针的声明方式
下面我们来看一个简单函数指针使用
#include<iostream>
using namespace std;
double mutiply(double a, double b)
{
return a * b;
}
double add(double a, double b)
{
return a + b;
}
int main()
{
double(*ptr)(double,double ) = mutiply;
double res = ptr(2, 3);
double res1 = (*ptr)(2, 3);
cout << "ress=" << res << " res1=" << res1 << endl;
ptr = &add; //凡是符合这样接口的函数都可以使用这样的指针来调用
double res3 = ptr(1, 2);
cout << "res3=" << res3 << endl;
}
这种函数的定义方式看上去比较繁琐,我们在函数指针的声明前面加上typedefine,这样ptr就不在是一个变量而是一个类型别名,代表指向这样一个函数的指针类型,为了方便讲typedefine定义的指针类型别名与函数指针区分开来,我们可以将别名用大写字母作为区分。
代码如下
#include<iostream>
using namespace std;
//typedef double (*FuncTypeptr)(double ,double);
typedef double (FuncTypeptr)(double, double);
double mutiply(double a, double b)
{
return a * b;
}
int main()
{
//FuncTypeptr ptr1= mutiply;
FuncTypeptr* ptr1 = mutiply;
double res = ptr1(1,2);
cout << "res=" << res << endl;
}
函数指针在C语言中的使用
在排序函数中传入compare函数指针,这样排序函数就可以通过闯入的指针来判断数值的大小。
代码如下
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
bool compare(float a, float b)
{
return a < b;
}
int main()
{
vector<float>num{ 0,1,2,3,6,3,7,11 };
sort(num.begin(), num.end(), compare);
for (auto a : num)
cout << a << " ";
}
在c++中我们可以通过重载一个类的函数运算符,来实现函数对象,使用函数对象代替函数指针。
代码如下
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
class Compare
{
public:
bool operator()(float a, float b)
{
return a < b;
}
};
int main()
{
vector<float>num{ 0,1,2,3,6,3,7,11 };
sort(num.begin(), num.end(), Compare());
for (auto a : num)
cout << a << " ";
}
#include<vector>
#include<iostream>
using namespace std;
class DemoClass {
public:
double add(double a, double b) { return a + b; };
double multiply(double a, double b) { return a * b; };
};
int main()
{
double (DemoClass:: * ptrMemberFunc)(double,double);
ptrMemberFunc = &DemoClass::add;
DemoClass obj;
double result = (obj.*ptrMemberFunc)(1,2);
cout << result << endl;
DemoClass* pobj = &obj;
ptrMemberFunc = &DemoClass::multiply;
result = (pobj->*ptrMemberFunc)(1, 2);
cout << result << endl;
}
同样适用于多态类中的虚函数