我是靠谱客的博主 迷你帽子,这篇文章主要介绍C++ Primer 第六章 函数 6.7 函数指针 练习和总结,现在分享给大家,希望可以做个参考。

6.7 函数指针

函数指针是指向函数的指针、函数指针是一种特殊的类型,函数的类型由返回值和形参列表中的形参类型决定。

复制代码
1
2
3
4
bool compare_length(const string&,const string&); //pf是上面这个函数类型的指针 bool (*pf)(const string&,const string&);

可以看到定义函数指针和定义数组指针很像。

函数指针格式为

复制代码
1
2
3
返回值类型 (*point)(形参列表)

数组指针定义的格式为

复制代码
1
2
类型 (*point)[维度]

使用函数指针

当我们把一个函数的函数名当做值来使用的时候,这个函数名就会被转化成函数的指针。

当然我们也可以显式的获取函数的地址。

复制代码
1
2
3
pf = compare_length; pf = &compare_length;//显式的获取其地址

如果要用的时候,我们可以直接调用,也可以先解引用,再调用。

复制代码
1
2
3
4
pf("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
2
int func(int (*get_size)(string str))

和使用数组指针时一样,我们可以使用给函数指针其类型别名

复制代码
1
2
3
4
5
6
7
int func(int){ } using func_p = int (*)(int) typedef int(*)(int) fun_p; typedef int (*fun_p)(int); typedef decltype(func)* fun_p;

以上四种类型别名定义的都是函数指针。

当然也可以定义函数类型。

复制代码
1
2
3
typedef 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
24
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++内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(82)

评论列表共有 0 条评论

立即
投稿
返回
顶部