指向函數的指針與指向函數的引用


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

  • 指向函數的指針與指向函數的引用其本質都是一樣的。
  • 指向函數的指針也支持指向函數模板的指針。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM