Lambda表达式是C++11中的一个新特性,它使得我们可以创建一个匿名函数对象,
这个对象可以作为参数传递给其他函数或者对象,也可以直接被调用。
Lambda表达式通常用来简化代码,特别是在使用STL算法时非常有用。
在Qt中,Lambda表达式也经常被用来处理信号与槽,它可以替代传统的信号槽连接方式,
使得代码更加简洁易懂。
下面是一些Lambda表达式的用法说明及举例代码:
```
[capture](parameters) -> return-type { body }
```
其中,`capture`是一个可选的捕获列表,用于捕获外部变量;
`parameters`是一个可选的参数列表;
`return-type`是返回值类型,也是一个可选项;`body`是Lambda表达式的函数体。
下面是一个简单的Lambda表达式示例:
```
auto lambda = []() { cout << "Hello, world!" << endl; };
lambda();
```
这个Lambda表达式没有捕获任何外部变量,也没有参数,返回值为void,
函数体只是简单地输出一行文本。
2. 捕获外部变量
Lambda表达式可以捕获外部变量,以便在函数体中使用。捕获方式有两种:
值捕获和引用捕获。值捕获会复制一份外部变量的值,而引用捕获则会引用外部变量。
```
int x = 10;
auto lambda1 = [x]() { cout << "x = " << x << endl; };
auto lambda2 = [&x]() { cout << "x = " << x << endl; };
x = 20;
lambda1(); // 输出 x = 10
lambda2(); // 输出 x = 20
```
在上面的例子中,`lambda1`捕获了变量`x`的值,因此在调用`lambda1`时,
输出的是捕获时的值10;`lambda2`捕获了变量`x`的引用,
因此在调用`lambda2`时输出的是当前的值20。
3. 参数列表
Lambda表达式可以带有参数列表,参数列表的语法与普通函数相同。
```
auto lambda = [](int x, int y) { return x + y; };
cout << lambda(1, 2) << endl; // 输出 3
```
在上面的例子中,`lambda`带有两个参数`x`和`y`,返回它们的和。
4. 返回值类型
Lambda表达式可以指定返回值类型,也可以自动推断返回值类型。
```
auto lambda1 = [](int x, int y) -> int { return x + y; };
auto lambda2 = [](int x, int y) { return x + y; };
cout << lambda1(1, 2) << endl; // 输出 3
cout << lambda2(1, 2) << endl; // 输出 3
```
在上面的例子中,`lambda1`显式指定了返回值类型为int,
而`lambda2`则使用了自动类型推断。
5. Lambda表达式作为函数参数
Lambda表达式可以作为函数参数传递。
```
std::vector<int> v = {1, 2, 3, 4, 5};
std::for_each(v.begin(), v.end(), [](int x) { cout << x << endl; });
```
在上面的例子中,`std::for_each`函数接受一个函数对象作为第三个参数,
我们使用一个Lambda表达式来输出v中的每个元素。
6. Lambda表达式作为信号槽
Lambda表达式可以替代传统的信号槽连接方式,使得代码更加简洁易懂。
```
connect(button, &QPushButton::clicked, [=]() {
QMessageBox::information(this, "Title", "Message");
});
```
在上面的例子中,我们使用Lambda表达式连接了QPushButton的clicked信号
和QMessageBox的information槽。
当按钮被点击时,会弹出一个消息框。
联系客服