指向函数的指针与指向函数的引用
程序员文章站
2022-06-23 23:34:05
``` // // main.cpp // 函数指针 // Created by mac on 2019/4/9. // Copyright © 2019年 mac. All rights reserved. // 函数指针的定义:double ( f) (double) ,f是一个指向函数的指针, ......
// // main.cpp // 函数指针 // created by mac on 2019/4/9. // copyright © 2019年 mac. all rights reserved. // 函数指针的定义:double (*f) (double) ,f是一个指向函数的指针,该函数带有一个double类型的参数,而且会返回一个double的值。 // 函数引用的定义:double (&f) (double), f是一个指向函数的引用,该函数带有一个double类型的参数,而且会返回一个double的值。 // *f外面的括号是必须添加的,因为()的优先级要高于* // 不添加(),导致的后果就是返回的是一个指向double值的指针。 // 除了函数指针指针以外,有没有函数引用?其次就是运算符重载的知识,看一下哪一些的运算符是支持重载的。 #include <iostream> #include "cmath" using namespace std; double f(double x){ return 2*x; } double sum(double (*f)(double),int n,int m){ double result=0; for (int i=n; i<=m; ++i) { result+=f(i); // result+=(*f)(i); 这才是正确的写法,f(i)是简写,两种方式都能正确的编译运行。 } return result; } //测试下函数引用 double sum(double (&f)(double),int n,int m){ double result=0; for (int i=n; i<=m; ++i) { result+=f(i); } return result; } template <class gentype> gentype g(gentype a) { return 2*a; } template <class gentype> gentype s(gentype (*f) (gentype),int n,int m) { gentype result = 0; for (int i=n; i<=m; ++i) { result+=f(i); } return result; } int main(int argc, const char * argv[]) { cout<<sum(&f,1,5)<<endl; //直接写成 sum(f,1,5);也是可以的,结果不会变。 cout<<sum(g<double>, 1, 5)<<endl; //这地方直接写成函数模版也是没有问题的。 cout<<s<double>(g<double>,1,5)<<endl; //在一个函数模版中调用另一个函数模版 cout<<sum(f, 1, 5)<<endl; //定义的函数引用也是对的。 cout<<sum(sin, 3, 7)<<endl; //调用其他符合f函数原型的函数,注意添加相应的头文件。 return 0; }
运行结果
30 30 30 30 -1.19704 program ended with exit code: 0
tips
- 指向函数的指针与指向函数的引用其本质都是一样的。
- 指向函数的指针也支持指向函数模板的指针。
上一篇: 数组中遍历的方法
下一篇: 学JAVA第十一天,属性与方法