日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 充電吧
[導(dǎo)讀]c11新特性中加入了lambda表達式,所以Qt 也支持需在.pro文件中加入CONFIG?+=?c++11 例子:?1????QString?program?=?"C:/Windows/Syste

c11新特性中加入了lambda表達式,所以Qt 也支持

需在.pro文件中加入

CONFIG?+=?c++11

例子:

?1????QString?program?=?"C:/Windows/System32/cmd.exe";
?2?????QStringList?arguments;
?3?????arguments?<<?"/c"?<<?"dir"?<<?"C:\";
?4?????QProcess*?cmdProcess?=?new?QProcess;
?5?????QObject::connect(cmdProcess,?&QProcess::readyRead,[=](){
?6?????????QTextCodec?*codec?=?QTextCodec::codecForName("GBK");
?7?????????QString?dir?=?codec->toUnicode(cmdProcess->readAll());
?8?????????qDebug()?<<?dir;
?9?????});
10?????cmdProcess->start(program,?arguments);

?


一段簡單的Code


我也不是文藝的人,對于Lambda的歷史,以及Lambda與C++的那段淵源,我也不是很熟悉,技術(shù)人,講究拿代碼說事。


復(fù)制代碼 代碼如下:



#include


?


當我第一次看到這段代碼時,我直接凌亂了,直接看不懂啊。上面這段代碼,如果你看懂了,下面的內(nèi)容就當時復(fù)習(xí)了;如果看不懂了,就接著和我一起總結(jié)吧。


基本語法


簡單來說,Lambda函數(shù)也就是一個函數(shù),它的語法定義如下:


復(fù)制代碼 代碼如下:



[capture](parameters) mutable ->return-type{statement}


?


1.[capture]:捕捉列表。捕捉列表總是出現(xiàn)在Lambda函數(shù)的開始處。實際上,[]是Lambda引出符。編譯器根據(jù)該引出符判斷接下來的代碼是否是Lambda函數(shù)。捕捉列表能夠捕捉上下文中的變量以供Lambda函數(shù)使用;


2.(parameters):參數(shù)列表。與普通函數(shù)的參數(shù)列表一致。如果不需要參數(shù)傳遞,則可以連同括號“()”一起省略;


3.mutable:mutable修飾符。默認情況下,Lambda函數(shù)總是一個const函數(shù),mutable可以取消其常量性。在使用該修飾符時,參數(shù)列表不可省略(即使參數(shù)為空);


4.->return-type:返回類型。用追蹤返回類型形式聲明函數(shù)的返回類型。我們可以在不需要返回值的時候也可以連同符號”->”一起省略。此外,在返回類型明確的情況下,也可以省略該部分,讓編譯器對返回類型進行推導(dǎo);


5.{statement}:函數(shù)體。內(nèi)容與普通函數(shù)一樣,不過除了可以使用參數(shù)之外,還可以使用所有捕獲的變量。


與普通函數(shù)最大的區(qū)別是,除了可以使用參數(shù)以外,Lambda函數(shù)還可以通過捕獲列表訪問一些上下文中的數(shù)據(jù)。具體地,捕捉列表描述了上下文中哪些數(shù)據(jù)可以被Lambda使用,以及使用方式(以值傳遞的方式或引用傳遞的方式)。語法上,在“[]”包括起來的是捕捉列表,捕捉列表由多個捕捉項組成,并以逗號分隔。捕捉列表有以下幾種形式:


1.[var]表示值傳遞方式捕捉變量var;
2.[=]表示值傳遞方式捕捉所有父作用域的變量(包括this);
3.[&var]表示引用傳遞捕捉變量var;
4.[&]表示引用傳遞方式捕捉所有父作用域的變量(包括this);
5.[this]表示值傳遞方式捕捉當前的this指針。


上面提到了一個父作用域,也就是包含Lambda函數(shù)的語句塊,說通俗點就是包含Lambda的“{}”代碼塊。上面的捕捉列表還可以進行組合,例如:


1.[=,&a,&b]表示以引用傳遞的方式捕捉變量a和b,以值傳遞方式捕捉其它所有變量;
2.[&,a,this]表示以值傳遞的方式捕捉變量a和this,引用傳遞方式捕捉其它所有變量。


不過值得注意的是,捕捉列表不允許變量重復(fù)傳遞。下面一些例子就是典型的重復(fù),會導(dǎo)致編譯時期的錯誤。例如:


3.[=,a]這里已經(jīng)以值傳遞方式捕捉了所有變量,但是重復(fù)捕捉a了,會報錯的;
4.[&,&this]這里&已經(jīng)以引用傳遞方式捕捉了所有變量,再捕捉this也是一種重復(fù)。


Lambda的使用


對于Lambda的使用,說實話,我沒有什么多說的,個人理解,在沒有Lambda之前的C++ , 我們也是那樣好好的使用,并沒有對缺少Lambda的C++有什么抱怨,而現(xiàn)在有了Lambda表達式,只是更多的方便了我們?nèi)懘a。不知道大家是否記得C++ STL庫中的仿函數(shù)對象,仿函數(shù)想對于普通函數(shù)來說,仿函數(shù)可以擁有初始化狀態(tài),而這些初始化狀態(tài)是在聲明仿函數(shù)對象時,通過參數(shù)指定的,一般都是保存在仿函數(shù)對象的私有變量中;在C++中,對于要求具有狀態(tài)的函數(shù),我們一般都是使用仿函數(shù)來實現(xiàn),比如以下代碼:


復(fù)制代碼 代碼如下:



#include


?


現(xiàn)在我們有了Lambda這個利器,那是不是可以重寫上面的實現(xiàn)呢?看代碼:


復(fù)制代碼 代碼如下:



#include


?


顯而易見的效果,代碼簡單了,你也少寫了一些代碼,也去試一試C++中的Lambda表達式吧。


關(guān)于Lambda那些奇葩的東西


看以下一段代碼:


復(fù)制代碼 代碼如下:



#include


?


程序輸出結(jié)果如下:


復(fù)制代碼 代碼如下:



by_val_lambda: 11
by_ref_lambda: 11
by_val_lambda: 11
by_ref_lambda: 12


你想到了么???那這又是為什么呢?為什么第三個輸出不是12呢?


在by_val_lambda中,j被視為一個常量,一旦初始化后不會再改變(可以認為之后只是一個跟父作用域中j同名的常量),而在by_ref_lambda中,j仍然在使用父作用域中的值。所以,在使用Lambda函數(shù)的時候,如果需要捕捉的值成為Lambda函數(shù)的常量,我們通常會使用按值傳遞的方式捕捉;相反的,如果需要捕捉的值成成為Lambda函數(shù)運行時的變量,則應(yīng)該采用按引用方式進行捕捉。


再來一段更暈的代碼:



復(fù)制代碼 代碼如下:


#include


?


這段代碼主要是用來理解Lambda表達式中的mutable關(guān)鍵字的。默認情況下,Lambda函數(shù)總是一個const函數(shù),mutable可以取消其常量性。按照規(guī)定,一個const的成員函數(shù)是不能在函數(shù)體內(nèi)修改非靜態(tài)成員變量的值。例如上面的Lambda表達式可以看成以下仿函數(shù)代碼:



復(fù)制代碼 代碼如下:


class const_val_lambda{public:const_val_lambda(int v) : val(v) {}void operator()() const { val = 3; } // 常量成員函數(shù)private:int val;};


?


對于const的成員函數(shù),修改非靜態(tài)的成員變量,所以就出錯了。而對于引用的傳遞方式,并不會改變引用本身,而只會改變引用的值,因此就不會報錯了。都是一些糾結(jié)的規(guī)則。慢慢理解吧。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉