為何要寫一篇博文呢?其實,系統學了c++一定會學到lambda表示式。不巧不巧,在秋招的浪潮中,我又被問到了關於lambda表示式,回過頭想一想,其實lambda表示式在c++中應用挺廣泛的。匿名函式,短小精悍,應該就是它的feature。
好記性不如爛筆頭,書上有路勤為徑。、
可呼叫物件:對於任何乙個物件或表示式,如果可以對其使用呼叫運算子,則稱它為可呼叫物件。目前,c++支援四種可呼叫物件:函式、函式指標、過載函式呼叫運算子()的類,lambda表示式
。
用途:在c++ algorithm中傳遞任何類別的可呼叫物件。
[capture list]( parameter list) mutable或exception- > return type
(1)lambda表示式中必須使用尾置返回來指定返回型別
。
(2)引數列表和返回型別可忽略
。
忽略引數列表,則傳參為空;
返回型別忽略以後,lambda根據函式體中的**推斷出返回型別,不包含return語句,則返回void。
(3)()
的用法
[=]
按照副本引用(值訪問)this,還有當前塊語句的區域性變數,不可以賦值,但可讀取(面試的時候,沒有答出唯讀的特點,只記住了值傳遞*_*
)。但是,在後面新增了mutable
,則可以修改此副本,但是真實值卻沒有被修改,即作用域只是在函式體內{}。
[&]
按照引用的方式(引用訪問)操作區域性變數,this(類成員函式為lambda),可以賦值,可以讀取
[this],可以
副本引用a,可以用 [=] [a]
直接引用a ,可以用 [&] [&a]
返回值->double
[double為返回值型別]
()
lambda表示式傳遞引數,實參和形參必須匹配,與普通函式不同,lambda不能有預設引數(但,我寫了沒報錯^_^
)。
tips:用過qt
的小夥伴,應該經常在connect
函式中,繫結事件響應的槽函式,有了lambda表示式以後,直接用這個就很方便了。
下面給出一些能表現上面特性的demo。
#include
using namespace std;
class person;f
(); cout << s << endl;}}
;int gsnr =9;
int m =
100;
intmain
(int argc,
char
*argv)
;f()
; cout << m << endl;
cout <<
"global m:"
<<
::m<< endl;
person p;
p.print()
; cout <<
"age:"
<< p.age ;
return0;
}
c 11 新特性 lambda表示式
iso c 11 標準的一大亮點是引入lambda表示式。基本語法如下 capture list parameter list return type 其中除了 其中捕獲列表可以為空 和 復合語句 相當於具名函式定義的函式體 其它都是可選的。它的型別是唯一的具有成員operator 的非聯合的類型別...
C 11新特性 lambda表示式
在c 11以後,形如這樣的語法。capture parameters mutable return type 稱為乙個lambda表示式,表達乙個匿名函式。從程式設計的角度上看,lambda是一種函式式程式設計。分析語法 1.capture,可以通過值傳遞或者引用傳遞的方式給匿名函式提供訪問父作用域...
C 11 新特性之Lambda表示式
一 lambda表示式 c 11中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或exception 宣告 返回值型別 可以看到,lambda主要分為五個部分 函式物件引數 操作符過載函式引數...