C++超詳細講解函數對象
更新時間:2022年06月01日 09:04:31 作者:清風自在 流水潺潺
在c++中,我們把所有能當作函數使用的對象統(tǒng)稱為函數對象。它是實現operator()的任何類型,此運算符被稱為調用運算符,當調用此操 作符時,其表現形式如同普通函數調用一般,因此取名叫函數對象
一、客戶需求
編寫一個函數
- 函數可以獲得斐波那契數列每項的值
- 每調用一次返回一個值
- 函數可根據需要重復使用

下面來看第一個解決方案:
#include <iostream>
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;
}輸出結果如下:

二、存在的問題
函數一旦開始調用就無法重來
- 靜態(tài)局部變量處于函數內部,外界無法改變
- 函數為全局函數,是唯一的,無法多次獨立使用
- 無法指定某個具體的數列項作為初始值
三、解決方案
函數對象
- 使用具體的類對象取代函數
- 該類的對象具備函數調用的行為
- 構造函數指定具體數列項的起始位置
- 多個對象相互獨立的求解數列項
四、函數對象
函數調用操作符(( ))
- 只能通過類的成員函數重載
- 可以定義不同參數的多個重載函數
所以最終解決方案如下:
#include <iostream>
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;
}
for (int i = 0; i < 5; i++)
{
cout << fib() <<endl;
}
cout << endl;
Fib fib2(10);
for (int i = 0; i < 5; i++)
{
cout << fib2() << endl;
}
return 0;
}輸出結果如下:

五、小結
- 函數調用操作符(( ))是可重載的
- 函數調用操作符只能通過類的成員函數重載
- 函數調用操作符可以定義不同參數的多個重載函數
- 函數對象用于在工程中取代函數指針
到此這篇關于C++超詳細講解函數對象的文章就介紹到這了,更多相關C++函數對象內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++基于灰度圖上色GrayToColorFromOther的實現
本文主要介紹了C++基于灰度圖上色GrayToColorFromOther的實現,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07

