lambad表示式的形式:(
)->return_type
[
]:不捕獲任何外部變數[=
]:以傳值的方式捕獲外部變數[&
]:以傳引用的方式捕獲外部變數
[this
]:如果是在類的成員方法中的話,可以捕獲this指標[=
,&a]
:a以引用的方式捕獲,其他都以值傳遞的方式進行捕獲
[a,&b]
:a以傳值的方式進行捕獲,b以傳引用的方式進行捕獲
int
main()
;//無需返回值,可以省略不寫
auto lam2 =
();lam1()
;lam2()
;auto lam3 =
(int a,
int b)
->
int;
cout <<
lam3(1
,99)<< endl;
int x =
999;
auto lam4 =[=
](int y)
->
int;
cout <<
lam4(1
)<< endl;
int z =
10000
;int j =
99999999
;auto lam5 =
[&z, j]()
mutable
;lam5()
; cout <<
"z = "
<< z <<
"j = "
<< j << endl;
return0;
}
執行結果:
this is lambad exp1
this is lambad exp2
1001000
z = 0 j = 99999999
規則如下:
[
]:對應類的成員變數 和 建構函式的引數列表
():對應給類的operator
()傳遞的引數
-> retutn_type返回值:指的是operator
()的返回值
:函式體指的是operator
()的函式題
其中,operator
()是乙個const方法,但是可以給lambad表示式(
)後面加mutable使失去const性質
下面拿幾個lambad表示式以及其編譯器給我們生成的類作解釋:
檔案操作的lambad
const string path =
"./"
;auto fileop =
[path]
(std::string filename)
->file*
;//對應的類為
class
fileop1
file *
operator()
(std::string filename)
private
: std::string path_;
};
比較兩個整形值的大小auto com =
[x,y]()
->
bool
;//對應的類為
template
<
typename ty =
int>
class
com1
bool
operator()
()const
private
: ty ma;
ty mb;
};
求解四個整形值的和auto add1 =
(int a =-1
,int b =-1
,int c =-1
,int d =-1
)->
int;
//對應的類是
template
<
typename ty =
int>
class
add1
intoperator()
(ty a,ty b,ty c,ty d)
const
};
lambad表示式實際上也是operator()運算過載,只不過我們程式猿不需要自己去實現對應的類,由編譯器給我們生成,使用時,實際上我們呼叫的是物件的operator();
lambad表示式的生命週期為當前語句,所以我們一般和std::function
搭配使用,將lambad表示式的型別保留下來;
由於預設生成的operator()是乙個常方法,所以,如果我們需要在operator()中修改值,需要這樣寫:()mutable -> type {}
,新增mutable。
Ognl表示式語言使用以及迭代
ognlcontext物件 ognlcontext用法 public classognldemo1 2.ognl 表示式語言語言取值,取根元素的值,不用帶 號 throwsexception test public voidtestogn2 throwsexception 3.ognl 對靜態方法呼...
匿名方法,lambad表示式,匿名類
其實lambad表示式就是 函式 或者說是 方法 寫法的乙個進化,越來越簡化而已,如數學方法裡的f x 匿名方法 顧名思義,匿名方法就是沒有名稱的方法,但是有定義引數。匿名方法最明顯的好處就是可以降低另寫乙個方法的工作量 另外乙個好處就是可以訪問呼叫者的變數,降低傳引數的複雜度。匿名方法不是乙個事先...
Day6 函式與Lambad表示式
函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的 段。函式能提高應用的模組性,和 的重複利用率。你已經知道python提供了許多內建函式,比如print 但你也可以自己建立函式,這被叫做使用者自定義函式。定義乙個函式 你可以定義乙個由自己想要功能的函式,以下是簡單的規則 def 函式名 引...