【C++深度剖析教程13】函数对象的分析
今天來學習函數對象。什么是函數對象呢?下面我們以一個例子來引出函數對象的概念。
假設我們需要編寫一個函數,實現下面這些功能:
-函數可以獲得斐波那契數列每一項的值
-每調用一次返回一個值
-函數可根據需要重復用使用
實現上面的幾個功能,我們一開始的邏輯或許是這樣的:
這個函數的打印結果為:
由打印結果看,我們貌似實現了斐波那契數列的值 的輸出。但是這個函數,是存在問題的:
*函數一旦調用就無法重來
*靜態函數變量處于函數內部,外部無法改變
*函數為全局函數,是唯一的,無法多次獨立使用。
*無法指定某個初始的數列項作為初始值打印輸出
針對以上問題,我們引出函數對象的感念:
函數對象:
-使用具體的類對象取代函數
-該類對象具有函數調用的行為
-構造函數,指定具體數列項的起始位置
-多個對象相互獨立的求解數列項。
如何讓類對象具有函數調用的行為:
*重載函數調用操作符()
-只能通過類的成員函數進行重載
-可以定義不同參數的多個重載函數
下面還是直接給出代碼分析吧,看代碼永遠比看文字生動形象:
#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++) //這個循環實現可以讓斐波那契數列的初始值從n開始輸出打印{int t = a1;a1 = a0 + a1;a0 = t;}}int operator () () //函數調用操作符()的重載{int ret = a1;a1 = a0 + a1;a0 = ret;return ret; //返回a1,就是要打印輸出的值} };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<5; i++){cout << fib2() << endl;}return 0; }運行結果為:
從這里可以看出,我們已經實現了第一個程序所沒有解決的問題:程序可以重復使用“對象函數”,可以從數列的某一個值作為初始值。
總結:
1.函數調用操作符()是可重載的
2.函數調用操作符只能通過類的成員函數重載
3.函數調用操作符,可以定義不同參數的多個重載函數
4.函數對象用于在工程中取代指針。
想一起探討以及獲得各種學習資源加我(有我博客中寫的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題。
總結
以上是生活随笔為你收集整理的【C++深度剖析教程13】函数对象的分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多目标进化优化_SDIM 学术讲座|分解
- 下一篇: 如何记账,教你在同一天记录多笔收支情况