lambda匿名函數透析ios
目錄編程
1 匿名函數的做用... 1app
2 匿名函數的格式... 1函數
3 匿名函數實例代碼... 3this
使用一個新東西以前,先要弄清楚這東西有什麼好處,有什麼做用,要不要用。匿名函數的做用是提供一種通常只在某處使用一次,並且代碼長度比較短的狀況,好比在一個函數中要將時間轉換爲字符串格式。若是你要在類中定義這個函數,則要命名一個函數,再實現函數,這個函數其餘地方又用不到,並且很短小,而外的增長了一個接口函數,感受大材小用;這樣咱們只要在用的地方實現一個匿名函數,這個匿名函數實現了簡單的功能,並且可使用做用域內的全部變量,若是是在類中定義一個函數,須要將用到的變量當作參數傳遞進去,而匿名函數不用採用參數傳入的形式,能夠直接使用做用域內的變量,減小形參和實參的傳遞,這應該是匿名函數簡潔的特性體現。spa
如圖所示匿名函數的格式如圖所示,[ 捕獲列表 ] ( 形參數列表 ) mutable(可選) 異常屬性 -> 返回值類型 { 函數體 }指針
(1)匿名函數以[]開頭,來聲明一個匿名函數,[]中能夠是等號=,表示做用域內的全部變量按值傳遞給匿名函數,匿名函數內對變量進行操做,不會改變做用域內變量的值,只是傳入變量的值進去。若是是&,則表示做用域內的全部變量按引用傳入匿名函數,匿名函數內部對變量的修改,會使做用域內的變量的值發生變化。若是懂得編程的人就知道,這實際上是按值傳遞參數和按引用傳遞參數的區別。若是須要指定特定的變量傳入匿名函數,在[]內用變量名(按值傳遞)或者&加變量名稱(按引用傳遞)的方式逐個添加。舉幾個實例就知道了。對象
1)[&]外部做用域中全部變量,按引用傳遞到匿名函數blog
2)[=]外部做用域中全部變量,按值傳遞到匿名函數接口
3)[=, &foo] foo變量按引用傳遞,其餘的變量按值傳遞
4)[x, &y] x按值傳遞,y按引用傳遞
5)[this] 截取當前類中的this指針。若是已經使用了&或者=就默認添加此選項。
這魔法般的變量捕獲是怎麼實現的呢?原來,lambda是經過建立個小類來實現的。這個類重載了操做符(),一個lambda函數是該類的一個實例。當該類被構造時,周圍的變量就傳遞給構造函數並以成員變量保存起來。看起來跟函數對象很類似。
(2)匿名函數的形參列表,和普通函數的形參列表同樣,在你調用的時候須要傳入一些自定義的參數,能夠添加到括號中;若是沒有形參,也能夠省略形參列表和括號;
(3)mutable的中文意思是「可變的,易變的」,跟constant(既C++中的const)是反義詞。在C++中,mutable也是爲了突破const的限制而設置的。被mutable修飾的變量,將永遠處於可變的狀態,即便在一個const函數中。咱們知道,若是類的成員函數不會改變對象的狀態,那麼這個成員函數通常會聲明成const的。可是,有些時候,咱們須要在const的函數裏面修改一些跟類狀態無關的數據成員,那麼這個數據成員就應該被mutalbe來修飾。默認狀況下, Lambda函數老是一個const函數, 一個const的成員函數是不能在函數體內修改非靜態成員變量的值,而mutable能夠取消其常量性,可以修改按引用傳遞的變量。 並且在使用該修飾符時, 參數列表不可省略(即便參數爲空)。
(4)異常標識;拋出異常;
(5)返回值類型,匿名函數的返回值,若是爲void,能夠連同符號」->」一塊兒省略. 若是返回類型明確,好比返回一個int型變量, 也能夠省略該部分, 讓編譯器對返回類型自行推導。
(6)函數體,內容與普通函數同樣, 不過除了可使用參數以外, 還可使用傳入的做用域內的變量;
(1)好比我要實現一個簡單的加減乘除的計算器;
// AnonymityFunction.cpp : Defines the entry point for the console application.
//
#include"stdafx.h"
#include <iostream>
using namespace std;
typedef enum//定義枚舉類型
{
add = 0,
sub,
mul,
divi
}op;
int main(int argc, char* argv[])
{
int a = 1, b = 2;//定義變量
//定義匿名函數,實現不一樣的運算符自動計算數值。
auto func = [=](op i) -> int
{
switch (i)
{
case add:
return a + b;
case sub:
return a - b;
case mul:
return a * b;
case divi:
return a / b;
}
};
cout << func(add) << endl;//3
system("pause");
}
(2)實現兩個變量的交換
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int a = 1, b = 2;//定義變量
auto change = [&]() mutable {int c = a; a = b; b = c; };
change();//a變爲2,b變爲1;
cout << "a=" << a<<"b="<<b;
system("pause");
return 0;
}