C++筆記 第三十五課 函式物件分析---狄泰學院
阿新 • • 發佈:2018-11-15
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第三十五課 函式物件分析
1.客戶需求
編寫一個函式
函式可以獲得斐波那契數列每項的值
每呼叫一次返回一個值
函式可根據需要重複使用
for(int i =0; i<10; i++)
{
cout << fib() << endl;
}
35-1 第一個解決方案
#include<iostream> #include<string> using namespace std; int fib() { static int a0 = 0; static int a1 = 1; int ret = a1; a1 = a0 + a1; a0 = ret; return ret; } int main() { for(int i=0;i<10;i++) { cout << fib() << endl; } cout << endl; for(int i=0;i<5;i++) { cout << fib() << endl; } return 0; } 執行結果 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
2.存在的問題
函式一旦開始呼叫就無法重來
靜態區域性變數處於函式內部,外界無法改變
函式為全域性函式,是唯一的,無法多次獨立使用
無法指定某個具體的數列項作為初始值
3.解決方案
函式物件
使用具體的類物件取代函式
該類的物件具備函式呼叫的行為
建構函式指定具體數列項的起始位置
多個物件相互獨立的求解數列項
4.函式物件
函式呼叫操作符(())
只能通過類的成員函式過載
可以定義不同引數的多個過載函式
35-2 最終解決方案
#include<iostream> #include<string> using namespace std; class Fib { int a0 ; int a1 ; public: Fib() { a0 = 0; a1 = 1; } Fib(int n) { a0 = 0; a1 = 1; for(int i=2; i<=n; i++) { int t = a1; a1 = a0 + a1; a0 = t; } } int operator () () { int ret = a1; a1 = a0 + a1; a0 = ret; return ret; } }; int main() { Fib fib; for(int i=0;i<10;i++) { cout << fib() << endl; } cout << endl; for(int i=0;i<5;i++) { cout << fib() << endl; } cout << endl; Fib fib2(10); for(int i=0;i<10;i++) { cout << fib2() << endl; } return 0; }
小結
函式呼叫操作符(())是可過載的
函式呼叫操作符只能通過類的成員函式過載
函式呼叫操作符可以定義不同引數的多個過載函式
函式物件用於在工程中取代函式指標