//
// 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
- 指向函數的指針與指向函數的引用其本質都是一樣的。
- 指向函數的指針也支持指向函數模板的指針。