欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

指向函数的指针与指向函数的引用

程序员文章站 2022-03-07 17:13:18
``` // // 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

  • 指向函数的指针与指向函数的引用其本质都是一样的。
  • 指向函数的指针也支持指向函数模板的指针。