介绍
C++11引入了许多新的语言特性,其中Lambda表达式和智能指针是两个重要的特性。
Lambda表达式是一种匿名函数,可以在需要调用函数的地方定义一个函数对象,而不必为这个函数对象命名。它可以捕获上下文中的变量,从而在函数体中使用这些变量。
智能指针是C++中的一个RAII(资源获取即初始化)类型,它提供了自动管理动态分配的内存资源的机制。
本文将详细解析Lambda表达式和智能指针的使用。
Lambda表达式
Lambda表达式的一般形式如下:
[capture](parameters) -> return_type { body }
capture
:捕获列表,指定在函数体中使用的外部变量parameters
:形参列表,指定函数的参数return_type
:返回类型body
:函数体
示例代码
下面是一个示例代码,演示了使用Lambda表达式对一个整数数组进行排序:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {5, 2, 8, 3, 1};
std::sort(nums.begin(), nums.end(), [](int a, int b) { return a < b; });
for (const auto& num : nums) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:1 2 3 5 8
,表示数组已按照升序排序。
捕获列表
Lambda表达式可以捕获上下文中的变量,捕获列表指定了需要捕获的变量及其捕获方式。
捕获方式有以下几种:
[]
:不捕获任何变量[&]
:按引用捕获所有变量[=]
:按值捕获所有变量[var]
:按值捕获var变量[&var]
:按引用捕获var变量
返回类型推导
Lambda表达式可以根据函数体的返回语句自动推导返回类型,也可以显式指定返回类型。使用->
来指定返回类型。
Lambda表达式作为函数参数
Lambda表达式可以作为函数参数传递,例如在std::algorithm
中的排序函数std::sort
中。它可以方便地定义一些简单的函数对象,从而不必为这些函数对象专门定义函数。
智能指针
C++11引入了三种智能指针:std::unique_ptr
、std::shared_ptr
和std::weak_ptr
。
std::unique_ptr
std::unique_ptr
是一种独占式智能指针,用于管理动态分配的资源。它拥有对资源的唯一所有权,并在其生命周期结束时自动释放资源。
示例代码:
#include <memory>
int main() {
std::unique_ptr<int> ptr(new int(5));
// 使用*运算符可以访问指针指向的值
std::cout << *ptr << std::endl;
// 使用get()函数可以获得原始指针
int* rawPtr = ptr.get();
// 释放资源
ptr.reset();
return 0;
}
std::shared_ptr
std::shared_ptr
是一种共享式智能指针,可以共享拥有对资源的所有权。它使用引用计数的方式进行资源管理,当最后一个std::shared_ptr
被销毁时才会释放资源。
示例代码:
#include <memory>
int main() {
std::shared_ptr<int> ptr1 = std::make_shared<int>(5);
std::shared_ptr<int> ptr2 = ptr1;
// 使用*运算符可以访问指针指向的值
std::cout << *ptr1 << std::endl;
std::cout << *ptr2 << std::endl;
// 使用get()函数可以获得原始指针
int* rawPtr = ptr1.get();
return 0;
}
std::weak_ptr
std::weak_ptr
是对std::shared_ptr
的一种扩展,它可以监听一个std::shared_ptr
的生命周期,但并不增加引用计数。它通常用于解决循环引用的问题。
示例代码:
#include <memory>
int main() {
std::shared_ptr<int> ptr1 = std::make_shared<int>(5);
std::weak_ptr<int> ptr2 = ptr1;
// 使用lock()函数可以获得一个可用的shared_ptr
std::shared_ptr<int> ptr3 = ptr2.lock();
if (ptr3) {
// 通过ptr3访问资源
std::cout << *ptr3 << std::endl;
}
return 0;
}
总结
本文分析了C++11新特性中的Lambda表达式和智能指针的使用。Lambda表达式为C++引入了一种新的匿名函数的定义方式,可以在需要函数对象的地方直接定义一个函数,并捕获上下文中的变量。智能指针则提供了对动态分配的内存资源的自动管理机制,避免了手动释放资源的问题。
这两个特性的引入使得C++的编程体验更加便捷和安全,值得广泛使用。
本文来自极简博客,作者:代码与诗歌,转载请注明原文链接:C++11新特性解析:Lambda表达式