lambda匿名函數透析

lambda匿名函數透析ios

目錄編程

1       匿名函數的做用... 1app

2       匿名函數的格式... 1函數

3       匿名函數實例代碼... 3this

 

1         匿名函數的做用

使用一個新東西以前,先要弄清楚這東西有什麼好處,有什麼做用,要不要用。匿名函數的做用是提供一種通常只在某處使用一次,並且代碼長度比較短的狀況,好比在一個函數中要將時間轉換爲字符串格式。若是你要在類中定義這個函數,則要命名一個函數,再實現函數,這個函數其餘地方又用不到,並且很短小,而外的增長了一個接口函數,感受大材小用;這樣咱們只要在用的地方實現一個匿名函數,這個匿名函數實現了簡單的功能,並且可使用做用域內的全部變量,若是是在類中定義一個函數,須要將用到的變量當作參數傳遞進去,而匿名函數不用採用參數傳入的形式,能夠直接使用做用域內的變量,減小形參和實參的傳遞,這應該是匿名函數簡潔的特性體現。spa

2         匿名函數的格式

如圖所示匿名函數的格式如圖所示,[ 捕獲列表 ] ( 形參數列表 ) 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)函數體,內容與普通函數同樣, 不過除了可使用參數以外, 還可使用傳入的做用域內的變量;

 

3         匿名函數實例代碼

(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;

}

相關文章
相關標籤/搜索