Qt 5——Lambda表達式


C++11中的Lambda表達式用於定義並創建匿名的函數對象,以簡化編程工作。首先看一下Lambda表達式的基本構成:

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

[函數對象參數] (操作符重載函數參數)mutable ->返回值{函數體}


① 函數對象參數 [ ];

[ ],標識一個Lambda的開始,這部分必須存在,不能省略。函數對象參數是傳遞給編譯器自動生成的函數對象類的構造函數的。函數對象參數只能使用那些到定義Lambda爲止時Lambda所在作用範圍內可見的局部變量(包括Lambda所在類的this)。函數對象參數有以下形式:

  • 空。沒有使用任何函數對象參數。
  • =。函數體內可以使用Lambda所在作用範圍內所有可見的局部變量(包括Lambda所在類的this),並且是值傳遞方式(相當於編譯器自動爲我們按值傳遞了所有局部變量)。
  • &。函數體內可以使用Lambda所在作用範圍內所有可見的局部變量(包括Lambda所在類的this),並且是引用傳遞方式(相當於編譯器自動爲我們按引用傳遞了所有局部變量)。
  • this。函數體內可以使用Lambda所在類中的成員變量。
  • a。將a按值進行傳遞。按值進行傳遞時,函數體內不能修改傳遞進來的a的拷貝,因爲默認情況下函數是const的。要修改傳遞進來的a的拷貝,可以添加mutable修飾符。
  • &a。將a按引用進行傳遞。
  • a, &b。將a按值進行傳遞,b按引用進行傳遞。
  • =,&a, &b。除a和b按引用進行傳遞外,其他參數都按值進行傳遞。
  • &, a, b。除a和b按值進行傳遞外,其他參數都按引用進行傳遞。

② 操作符重載函數參數 ();

標識重載的()操作符的參數,沒有參數時,這部分可以省略。參數可以通過按值(如:(a,b))和按引用(如:(&a,&b))兩種方式進行傳遞。

③ 可修改標示符 mutable;

mutable聲明,這部分可以省略。按值傳遞函數對象參數時,加上mutable修飾符後,可以修改按值傳遞進來的拷貝(注意是能修改拷貝,而不是值本身)。

 QPushButton * myBtn = new QPushButton (this);
    QPushButton * myBtn2 = new QPushButton (this);
    myBtn2->move(100,100);
    int m = 10;

    connect(myBtn,&QPushButton::clicked,this,[m] ()mutable { m = 100 + 10; qDebug() << m; });

    connect(myBtn2,&QPushButton::clicked,this,[=] ()  { qDebug() << m; });

    qDebug() << m;

④ 函數返回值 ->;

->返回值類型,標識函數返回值的類型,當返回值爲void,或者函數體中只有一處return的地方(此時編譯器可以自動推斷出返回值類型)時,這部分可以省略。

⑤ 是函數體 {};

{},標識函數的實現,這部分不能省略,但函數體可以爲空

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章