日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

【C++深度剖析教程13】函数对象的分析

發(fā)布時(shí)間:2023/12/10 c/c++ 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++深度剖析教程13】函数对象的分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天來(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)始的邏輯或許是這樣的:

#include <iostream> #include <string>using namespace std;int fib() {static int a0 = 0;static int a1 = 1;int ret = a1; //先將a1保存起來(lái)給reta1 = a0 + a1;a0 = ret; //再將a1的值給a0return ret; //此時(shí)ret為a1,即要輸出的每一項(xiàng) }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; }

這個(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。