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来存储相同类型的函数指针,还是统一调用。

发布了54 篇原创文章 · 获赞 6 · 访问量 3345

猜你喜欢

转载自blog.csdn.net/zengqi12138/article/details/104108852