6.7 函数指针
函数指针是指向函数的指针、函数指针是一种特殊的类型,函数的类型由返回值和形参列表中的形参类型决定。
复制代码
1
2
3
4bool compare_length(const string&,const string&); //pf是上面这个函数类型的指针 bool (*pf)(const string&,const string&);
可以看到定义函数指针和定义数组指针很像。
函数指针格式为
复制代码
1
2
3返回值类型 (*point)(形参列表)
数组指针定义的格式为
复制代码
1
2类型 (*point)[维度]
使用函数指针
当我们把一个函数的函数名当做值来使用的时候,这个函数名就会被转化成函数的指针。
当然我们也可以显式的获取函数的地址。
复制代码
1
2
3pf = compare_length; pf = &compare_length;//显式的获取其地址
如果要用的时候,我们可以直接调用,也可以先解引用,再调用。
复制代码
1
2
3
4pf("123","123"); (*pf)("123","123"); compare_length("123","123");
这三者是等价的
重载函数的指针
之前说过函数类型由返回值和形参列表决定,所以对于重载函数,每一个函数都有自己的函数指针,而且只能给自己用。
函数指针形参
和数组一样,数组不能直接作为形参,但是可以定义数组指针,所以我们也可以定义函数指针。
在形参列表中,就算我们定义的是函数类型,也会被转变为函数指针。
思想和定义数组指针很相似
复制代码
1
2
3
4
5//定义数组指针 int func(int a[10],int i,int j); //定义函数指针 int func( int get_size(string str),int i,int j )
get_size 会转化为函数指针,当然我们也可以显式的定义
复制代码
1
2int func(int (*get_size)(string str))
和使用数组指针时一样,我们可以使用给函数指针其类型别名
复制代码
1
2
3
4
5
6
7int func(int){ } using func_p = int (*)(int) typedef int(*)(int) fun_p; typedef int (*fun_p)(int); typedef decltype(func)* fun_p;
以上四种类型别名定义的都是函数指针。
当然也可以定义函数类型。
复制代码
1
2
3typedef int fun_p(int); typedef decltype(func) fun_p;
再说一遍,函数类型在形参中会被自动转化为函数指针。
返回指向函数的指针
和数组一样,我们可以返回指向数组的指针,也可以返回指向函数的指针。
复制代码
1
2
3
4
5
6
7
8
9
10
11//指向函数的指针 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,使用方法和之前在返回数组指针的使用方法是一样的。
需要注意的是,和在形参列表中不同,返回值中使用函数类型不会自动的转化为函数指针。
练习
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24int 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++内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复