日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

pb通过对象名称调用对象_C++ 可调用对象(二)

發布時間:2025/3/11 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pb通过对象名称调用对象_C++ 可调用对象(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
點擊上方“藍字”,發現更多精彩。本文在前一篇關于函數對象、bind 函數的基礎上,對 C++ 中 lambda不表達式的使用進行總結。lambda01PART定義一個 lambda 表達式表示一個可調用的代碼單元,可以理解為是一個未命名的內斂函數。類似任何函數,一個 lambda 具有返回類型、參數列表和函數體;和普通函數不同, lambda 必須使用尾置返回來指定返回類型。

①.捕獲列表捕獲列表是一個 lambda 所在函數中定義的局部變量的列表,捕獲列表能夠捕捉上下文中的變量以供 lambda 使用。捕獲列表可以為空,但 [] 不可以省略,編譯器依次來判斷接下來的代碼是否是 lambda 表達式。②.參數列表和普通函數的參數列表一致,如果不需要參數傳遞,則可以連同括號 () 一起省略。lambda 中參數不能有缺省值,也不能有無名參數。③.mutable默認情況下,對于一個值被拷貝的變量,lambda 不會改變其值,加上 mutable 修飾符后,可以修改傳遞進來的拷貝。在使用 mutable 修飾符時,參數列表部分不可省略,但列表可以為空。④.返回類型標識函數返回值的類型,當返回值為 void,或者函數體中只有一處 return 時可用省略。⑤.函數體標識函數的實現,內容與普通函數一樣,不過除了可以使用參數之外,還可以使用所有捕獲的變量。函數體不能省略,但函數體可以為空。02PART捕獲列表

①.概念

一個 lambda 通過將局部變量包含在其捕獲列表中來指定將會使用這些變量,只能使用明確指明的變量;變量捕獲方式可以傳值捕獲,也可以傳引用捕獲。

②.按值捕獲變量

在捕獲列表中指定變量名字,類似傳值的參數,被捕獲的變量值將在 lambda 創建時被拷貝。

③.按引用捕獲變量

用 & 引用捕獲,一個以引用方式捕獲的變量,在 lambda 中被使用時,實際上使用的引用所綁定的對象。

④.多參數捕獲

捕獲列表中可以指定捕獲多個參數,并且可以為每個參數指定捕獲方式。

⑤.隱式按值捕獲

使用 [=] 表示按值捕獲 lambda 所在范圍內所有可見的局部變量。

⑥.隱式按引用捕獲

使用 [&] 表示按引用方式捕獲 lambda 所在范圍內所有可見的局部變量。

⑦.隱式混和捕獲

使用 [=,prams] 表示除 xxx 按引用捕獲外,其他所有參數按值捕獲;使用 [&,prams]? 表示除 xxx 按值捕獲外,其他所有參數按引用捕獲。

04PART指定返回類型

如果一個 lambda 函數體包含了 return 之外的任何語句,則編譯器假定返回類型為 void,此時我們必須指定返回值類型。

05PARTlambda 是函數對象

定義一個 lambda ,編譯器會生成一個與 lambda 對應的新的類類型。當向一個函數傳遞一個 lambda 時,同時定義了一個新類型和該類型的一個對象,生成的類包含所捕獲變量對應的數據成員,數據成員在類創建時被初始化。

int sum = 0;std::vector<int> vec = { 1,2,3,4,5 };std::for_each(begin(vec), end(vec), [&sum](int x){sum += x;});

上述代碼被編譯器翻譯后變為:

class lambda_b{private: int* m_pSum;public: lambda_b(int* pSum) { m_pSum = pSum; } void operator()(int x) const { *m_pSum += x; }};int sum = 0;std::vector<int> vec = { 1,2,3,4,5 };std::for_each(begin(arry), end(arry), lambda_b(&sum));06PARTlambda 使用

lambda 表達式實際為一個函數對象,可以把匿名函數保存在變量當有名函數來使用。

①.使用 auto 保存

int a = 1;int b = 2;//使用 auto 保存 lambda auto func = [a, &b](int c)mutable ->int { b = a + c; return a; };//做有名函數使用 cout << b << " "<< func(10) << endl;

②.函數指針保存

當 lambda 的捕獲外部變量列表為空時,可使用普通函數指針來保存。

//使用函數指針保存 lambda int(*func1)(int) = [](int x) {return x; };//函數調用int a = func1(20);

③.使用 std::function 模板類型

#include std::function<float(int,float)> fun1 = [](int x, float y) { return x + y; };float a = fun1(12,1.2);//函數調用

函數對象C++ 可調用對象(一)

掃碼關注持續獲取最新文章c++學習 算法與數據結構

總結

以上是生活随笔為你收集整理的pb通过对象名称调用对象_C++ 可调用对象(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。