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