概述
6.7 函数指针
函数指针是指向函数的指针、函数指针是一种特殊的类型,函数的类型由返回值和形参列表中的形参类型决定。
bool compare_length(const string&,const string&);
//pf是上面这个函数类型的指针
bool (*pf)(const string&,const string&);
可以看到定义函数指针和定义数组指针很像。
函数指针格式为
返回值类型
(*point)(形参列表)
数组指针定义的格式为
类型 (*point)[维度]
使用函数指针
当我们把一个函数的函数名当做值来使用的时候,这个函数名就会被转化成函数的指针。
当然我们也可以显式的获取函数的地址。
pf = compare_length;
pf = &compare_length;//显式的获取其地址
如果要用的时候,我们可以直接调用,也可以先解引用,再调用。
pf("123","123");
(*pf)("123","123");
compare_length("123","123");
这三者是等价的
重载函数的指针
之前说过函数类型由返回值和形参列表决定,所以对于重载函数,每一个函数都有自己的函数指针,而且只能给自己用。
函数指针形参
和数组一样,数组不能直接作为形参,但是可以定义数组指针,所以我们也可以定义函数指针。
在形参列表中,就算我们定义的是函数类型,也会被转变为函数指针。
思想和定义数组指针很相似
//定义数组指针
int func(int a[10],int i,int j);
//定义函数指针
int func( int get_size(string str),int i,int j )
get_size 会转化为函数指针,当然我们也可以显式的定义
int func(int (*get_size)(string str))
和使用数组指针时一样,我们可以使用给函数指针其类型别名
int func(int){
}
using func_p = int (*)(int)
typedef int(*)(int) fun_p;
typedef int (*fun_p)(int);
typedef decltype(func)* fun_p;
以上四种类型别名定义的都是函数指针。
当然也可以定义函数类型。
typedef int fun_p(int);
typedef decltype(func) fun_p;
再说一遍,函数类型在形参中会被自动转化为函数指针。
返回指向函数的指针
和数组一样,我们可以返回指向数组的指针,也可以返回指向函数的指针。
//指向函数的指针
int (*arr_ptr)func()[10];
using arr_ptr = int[10];
arr_ptr* func();
auto arr_ptr()->int(*)[10];
//类似的指向函数的指针
int
(*func(int,int))(int)//func是一个函数,其返回指针类型,但是这个指针由形参列表,所以他是一个指向函数的指针,这个函数的返回值为int
using func_p = int(*)(int);
auto func(int,int)->int(*)(int);
初次之外我们还可以使用decltype,使用方法和之前在返回数组指针的使用方法是一样的。
需要注意的是,和在形参列表中不同,返回值中使用函数类型不会自动的转化为函数指针。
练习
int add(int a, int b) {
//cout<<a+b<<endl;
return a+b;
}
int sub(int a, int b) {
return a - b;
}
int mul(int a, int b) {
return a * b;
}
int division(int a,int b) {
return a / b;
}
using func_p = int(*)(int, int);
vector<func_p> vec_p;
vec_p.push_back(&add);
vec_p.push_back(&sub);
vec_p.push_back(&mul);
vec_p.push_back(&division);
int a = 10, b = 5;
for (auto func : vec_p) {
cout<<func(a,b)<<endl;
}
非常有意思,可以通过vec来存储相同类型的函数指针,还是统一调用。
最后
以上就是迷你帽子为你收集整理的C++ Primer 第六章 函数 6.7 函数指针 练习和总结的全部内容,希望文章能够帮你解决C++ Primer 第六章 函数 6.7 函数指针 练习和总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复