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

概述

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 函数指针 练习和总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部