C++中Lambda表達(dá)式的語(yǔ)法與實(shí)例
概述
C++ 11 中的 Lambda 表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對(duì)象,以簡(jiǎn)化編程工作。Lambda 的語(yǔ)法形式如下:
[捕獲列表] (參數(shù)) mutable 或 exception 聲明 -> 返回值類型 {函數(shù)體}
//計(jì)算兩個(gè)值的和
auto func = [](int a, int b) -> int{return a+b;};
//當(dāng)返回值的類型是確定時(shí),可以忽略返回值
auto func = [](int a, int b){return a + b;};
//調(diào)用
int sum = func(1, 3);
語(yǔ)法分析
捕獲列表
Lambda 表達(dá)式相當(dāng)于一個(gè)類,那么捕獲列表就是傳遞給這個(gè)類的類成員。比如:
class Labmda
{
public:
const int test;
Labmda(int value):test(value)
{
}
public:
int run(int a, int b)
{
return a + b + test;
}
}
int main()
{
int test = 10;
auto func = Labmda(test);
int sum = func.run(1, 3);
}
//使用Lambda 表達(dá)式的寫法
int main()
{
int test = 10;
auto func = [test](int a, int b){return a + b + test;};
int sum = func(1, 3);
}
捕獲列表有以下格式:
| 格式 | 描述 |
|---|---|
| [] | 不帶任何參數(shù) |
| [=] | Lambda表達(dá)式之前的局部變量,包括所在類的this,變量按值方式傳遞 |
| [&] | Lambda表達(dá)式之前的局部變量,包括所在類的this,變量按引用方式傳遞 |
| [this] | Lambda表達(dá)式所在類的this |
| [a] | Lambda表達(dá)式之前的局部變量a的值,也可以傳入多個(gè)值,如[a , b] |
| [&a] | Lambda表達(dá)式之前的局部變量a的引用 |
關(guān)鍵字聲明
關(guān)鍵字聲明一般都很少用到,也不建議隨便使用,可以忽略不計(jì)。
mutable
當(dāng)捕獲列表以值的方式傳遞時(shí)有效,加上此關(guān)鍵字后,可以修改Lambda類成員(帶const修飾符)。比如:
int test = 10;
//編譯報(bào)錯(cuò),test成員不能修改
auto func = [test](int a, int b){test = 8; return a + b + test;};
//編譯正常
auto func = [test](int a, int b)mutable {test = 8; return a + b + test;};
這里需要注意的是:Lambda類成員test修改之后,并不會(huì)改變外部int test的值。
exception
exception 聲明用于指定函數(shù)拋出的異常,如拋出整數(shù)類型的異常,可以使用 throw(int)
示例
捕獲列表按值傳遞
int test = 10;
auto func = [=](int a, int b){return a + b + test;};
auto func2 = [test](int a, int b){return a + b + test;};
int sum = func(1, 3); //sum等于14
這里需要注意的是func表達(dá)式中test的值只更新到表達(dá)式之前:
int test = 10;
auto func = [=](int a, int b){return a + b + test;};
test = 5;
int sum = func(1, 3); //sum還是等于14
捕獲列表按引用傳遞
int test = 10;
auto func = [&](int a, int b){test = 5; return a + b + test;};
auto func2 = [&test](int a, int b){test = 5; return a + b + test;};
int sum = func(1, 3); //sum等于9,test等于5
這里func表達(dá)式中test的值就能隨時(shí)更新:
int test = 10;
auto func = [=](int a, int b){return a + b + test;};
test = 5;
int sum = func(1, 3); //sum等于9,test等于5
總結(jié)
到此這篇關(guān)于C++中Lambda表達(dá)式的文章就介紹到這了,更多相關(guān)C++中Lambda表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++語(yǔ)言實(shí)現(xiàn)線性表之鏈表實(shí)例
這篇文章主要介紹了C++語(yǔ)言實(shí)現(xiàn)線性表之鏈表,實(shí)例分析了C++實(shí)現(xiàn)線性表中鏈表的原理與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
適合初學(xué)者的C語(yǔ)言數(shù)據(jù)類型的講解
在 C 語(yǔ)言中,數(shù)據(jù)類型指的是用于聲明不同類型的變量或函數(shù)的一個(gè)廣泛的系統(tǒng)。變量的類型決定了變量存儲(chǔ)占用的空間,以及如何解釋存儲(chǔ)的位模式。2022-04-04
C++中String增刪查改模擬實(shí)現(xiàn)方法舉例
這篇文章主要給大家介紹了關(guān)于C++中String增刪查改模擬實(shí)現(xiàn)方法的相關(guān)資料,String是C++中的重要類型,程序員在C++面試中經(jīng)常會(huì)遇到關(guān)于String的細(xì)節(jié)問(wèn)題,甚至要求當(dāng)場(chǎng)實(shí)現(xiàn)這個(gè)類,需要的朋友可以參考下2023-11-11
C++中二進(jìn)制數(shù)據(jù)序列化和反序列化詳解
這篇文章主要為大家詳細(xì)介紹了C++中二進(jìn)制數(shù)據(jù)序列化和反序列化的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-11-11
C++分步實(shí)現(xiàn)職工管理系統(tǒng)詳解
這篇文章主要為大家詳細(xì)介紹了基于C++實(shí)現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-10-10
C語(yǔ)言對(duì)堆排序一個(gè)算法思路和實(shí)現(xiàn)代碼
這篇文章主要介紹了C語(yǔ)言對(duì)堆排序一個(gè)算法思路和實(shí)現(xiàn)代碼,堆排序是一種樹形選擇排序,是對(duì)直接選擇排序的有效改進(jìn),需要的朋友可以參考下2014-06-06
C++繼承中的對(duì)象構(gòu)造與析構(gòu)和賦值重載詳解
這篇文章主要為大家詳細(xì)介紹了C++繼承中的對(duì)象構(gòu)造與析構(gòu)和賦值重載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03

