返回指向函数的指针,该小节初开始难以从字面上理解该节内容的意义。
反复斟酌后,意识到其实这是一个普通的函数,该函数的返回类型是指针,指针却是指向函数类型的。所以调用该函数后得到的返回指针,指向了该类函数类型。
当然,最简单的方法是使用类型别名~
using F = int(int,int); using PF = int(*)(int,int);
其中我们使用类型别名将F定义成函数类型,将PF定义成指向函数类型的指针。必须时刻注意的是,和函数类型的形参不同,函数类型不会自动地转换成指针,这需要我们显示的将返回类型指定为指针。
当然也可以如下形式去定义:
int (*f1())(int,int);
当然也可以使用尾置返回类型的方式
最后放上本6.7节的习题
练习6.54:编写函数的声明,令其接收两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。
练习 6.55:编写4个函数,分别对两个int值执行加、减、乘、除运算;在上一题创建的vector对象中保存这些函数的指针。
练习 6.56:调用上述vector对象的每个元素并输出其结果。
代码如下:
#include "stdafx.h" #include <iostream> #include <vector> //练习6.54:编写函数的声明,令其接收两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。 // //练习 6.55:编写4个函数,分别对两个int值执行加、减、乘、除运算;在上一题创建的vector对象中保存这些函数的指针。 // //练习 6.56:调用上述vector对象的每个元素并输出其结果。 using namespace std; //练习 6.56:调用上述vector对象的每个元素并输出其结果。 int func(int, int); typedef int(*pc)(int, int);////使用类型别名的方法 vector<int(*)(int, int)> vec1; ////声明(原始)1:按内向外的顺序阅读,定义了该类型函数指针的vector对象。 vector<pc> vec2; //练习 6.55:编写4个函数,分别对两个int值执行加、减、乘、除运算;在上一题创建的vector对象中保存这些函数的指针。 int Add(int a, int b) { return a + b; } int Sub(int a, int b) { return a - b; } int Multiply(int a, int b) { return a * b; } int Divide(int a, int b) { if (b != 0) return a / b; } /////第三种方法:利用返回指向函数的指针 int(*v1())(int, int) ////////该方法定义一个函数,函数将返回一个指向该函数类型的函数指针 { //可以直接解引用该方法进行运算 return Sub; } int(*v2())(int, int) { return Add; } //............. //练习 6.56:调用上述vector对象的每个元素并输出其结果。 int main() { int x(520), y(1314); cout << (((*v1)()) (x, y)) << endl; ////可以看到该方法多复杂,但是返回的指针在其他地方有用处 cout << (((*v2)()) (x, y)) << endl; int(*f1)(int, int) = Add; ///第一种方法,声明函数指针,并且指向函数 int(*f2)(int, int) = Sub; int(*f3)(int, int) = Multiply; int(*f4)(int, int) = Divide; vec1.push_back(f1); ///将指针插入到容器中 vec1.push_back(f2); vec1.push_back(f3); vec1.push_back(f4); pc p1 = Add; ///第二种方法,使用函数类型类型别名,去声明函数指针,并且指向对应的函数 pc p2 = Sub; //果然是使用类型别名的方法最舒服~~~ pc p3 = Multiply; pc p4 = Divide; vec2.push_back(p1); vec2.push_back(p2); vec2.push_back(p3); vec2.push_back(p4); for (auto c : vec1) { cout <<"输出函数指针计算后的结果"<< (c(x,y)) << endl; } return 0; for (auto c : vec2) { cout << "输出函数指针计算后的结果" << (c(x, y)) << endl; } return 0; }