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

//
//  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

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

猜你喜欢

转载自www.cnblogs.com/overlows/p/10678979.html