1. 程式人生 > >C++筆記 第三十五課 函式物件分析---狄泰學院

C++筆記 第三十五課 函式物件分析---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習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;
}

小結
函式呼叫操作符(())是可過載的
函式呼叫操作符只能通過類的成員函式過載
函式呼叫操作符可以定義不同引數的多個過載函式
函式物件用於在工程中取代函式指標