C 中閉包的使用

2021-09-11 01:31:11 字數 2234 閱讀 2765

二.c++中閉包的實現

三.c++中使用閉包的注意事項

參考資料

1.維基百科中的閉包概念

在電腦科學中,閉包(closure),又稱詞法閉包(lexical closure)或函式閉包(function closures),是引用了自由變數(未繫結到特定物件)的函式。這個被引用的自由變數將和這個函式一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函式和與其相關的引用環境組合而成的實體。閉包在執行時可以有多個例項,不同的引用環境和相同的函式組合可以產生不同的例項。

2. 歷史由來

彼得·蘭丁在2023年將術語「閉包」定義為一種包含環境成分和控制成分的實體,用於在他的secd機器上對表示式求值。joel moses認為是landin發明了「閉包」這一術語,用來指代某些其開放繫結(自由變數)已經由其語法環境完成閉合(或者繫結)的lambda表示式,從而形成了閉合的表示式,或稱閉包。這一用法後來於2023年被sussman和steele在定義 scheme語言的時候予以採納。並廣為流傳。彼得·蘭丁在2023年將術語「閉包」定義為一種包含環境成分和控制成分的實體,用於在他的secd機器上對表示式求值。joel moses認為是landin發明了「閉包」這一術語,用來指代某些其開放繫結(自由變數)已經由其語法環境完成閉合(或者繫結)的lambda表示式,從而形成了閉合的表示式,或稱閉包。這一用法後來於2023年被sussman和steele在定義 scheme語言的時候予以採納。並廣為流傳。

3.閉包的簡單理解

為閉包。

這個特殊函式我見過的三種不同的說法:引用了自由變數的函式,帶有上下文的函式,有狀態的函式。

第二種說法,簡單來說就是認為其他函式內部變數+讀取這個函式形成的整體為閉包。

相比較之下,第二種說法更為確切。

在不同的語言中閉包有不同的實現凡是,在c++中,閉包一般有三種實現方式。

1.類中過載()運算子

通過在過載函式呼叫運算子中使用類的成員資料實現閉包,一般在c++中也稱閉包為攜帶了狀態的函式物件。外部變數即為函式物件的狀態。

這種方式使用閉包比較繁瑣,對於每一段閉包**都要單獨寫乙個函式物件類,所以c++11中引入了更為方便的方式。

class

functionobject

intoperator()

(int x,

int y)

private

:int _count;

//函式物件的狀態};

intmain()

2.bind函式

bind通過把外部變數函式繫結在一起實現閉包,bind返回值為乙個函式物件,可使用類模板function接收

bind和function被定義在標頭檔案中

#include

intfunc

(int x,

int y)

intmain()

//typedef int(*function)(int,int); //函式指標

//function f = func; //c通過函式指標實現類似操作

//f(a,b);

3.lambda表示式(匿名函式)
// 內為匿名函式捕獲外部變數的列表,()內為函式引數列表

[capture list]

(params list)

[capture list]

//無參匿名函式

//使用例項

;

[capture list]

(params list)

mutable exception-

>

return type

int i =

1024

;auto func =[=

];//使用func接管這個匿名函式

//這裡func即為乙個閉包

c++閉包中儲存了其**內全部向外引用的變數的拷貝引用。如果是對外界環境中的物件的引用,且閉包執行時該外界環境的變數已經不存在(如在呼叫棧上已經展開),那麼可導致未定義行為,因為c++並不擴充套件這些被引用的外界環境的變數的生命期。

翻譯成白話文,就是閉包只使用這些變數,不管這些變數的生存週期

閉包 Python中的閉包

通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...

python中 閉包 的使用

閉包 1.函式的再認識 函式名僅僅是乙個變數,只不過指向的是定義的函式體,通過函式名 可以呼叫該函式 如果函式名 被修改了,那麼再次執行函式名 時,呼叫的就不是之前的函式了 小結 1.函式名也是變數 2.可以把函式名當做引數來使用 2.閉包的結構 1.外部函式 外部函式返回內部函式的位址空間引用 2...

scala中閉包的使用

閉包的實質就是 與用到的非區域性變數的混合,即 閉包 用到的非區域性變數 例項1 匿名函式中引入閉包 val multiplier i int i factor 在 multiplier 中有兩個變數 i 和 factor。其中的乙個 i 是函式的形式引數,在 multiplier 函式被呼叫時,i...