1. Lambda表达式
C++11新增了Lambda表达式,可以更方便地定义并使用匿名函数。
1.1 Lambda表达式语法
Lambda表达式的基本结构如下:
[capturer](parameters) mutable -> return_type{body}
其中,
capturer: 捕获列表,表示Lambda表达式可以使用的外部变量
parameters: 参数列表,表示Lambda函数的参数
mutable: 可选修饰符,表示是否可以修改capturer中的变量
return_type: 返回类型,表示Lambda函数返回值的类型
body: 函数体,表示Lambda函数要执行的代码
例如,定义一个Lambda表达式:
auto sum = [](int a, int b){return a + b;};
这个Lambda表达式接受两个int型参数,返回它们的和。
2. 自动类型推导
C++11对于变量的类型推导进行了扩展,可以使用auto关键字自动推导变量的类型。
2.1 auto类型推导的优点
使用auto关键字进行变量声明可以带来以下优点:
简化代码
增加可读性
方便迁移
例如:
auto i = 0;
这种方式甚至可以省略掉类型,让编译器自行检测:
auto i = 5.5;
这样就可以省略掉类型声明double。
3. 数组和Vector初始化
C++11新增了更方便的数组和vector初始化方式,可以使用花括号来进行初始化。
3.1 初始化数组
使用花括号对数组进行初始化:
int arr[] = {1, 2, 3, 4, 5};
这样就可以方便地对数组进行初始化,让代码更加简洁易读。
3.2 初始化vector
使用花括号对vector进行初始化:
std::vector<int> vec{1, 2, 3, 4, 5};
这样就可以方便地对vector进行初始化,让代码更加简洁易读。
4. Range-based for循环
C++11新增了range-based for循环,可以更方便地遍历数组、容器等元素。
4.1 Range-based for循环的语法
Range-based for循环的基本语法如下:
for (variable : container) { statement }
其中,
variable: 用于遍历container中元素的变量
container: 要遍历的容器
statement: 要执行的代码
例如,使用range-based for循环遍历数组:
int arr[] = {1, 2, 3, 4, 5};
for (int i : arr) {
std::cout << i << " ";
}
这个循环会依次输出1, 2, 3, 4, 5。
5. 智能指针
C++11新增了智能指针,可以解决内存管理问题。
5.1 shared_ptr
shared_ptr是一种智能指针,可以多个指针共享同一个对象。它会记录有多少个指针共享对象,当这个计数器归零时,它会自动销毁对象。
使用shared_ptr的示例如下:
auto shared = std::make_shared<int>();
std::shared_ptr<int> shared1 = shared;
std::shared_ptr<int> shared2 = shared;
std::cout << shared1.use_count() << std::endl; // output: 3
这段代码中,创建了一个shared_ptr<int>类型的智能指针shared,并赋值给了两个新的智能指针shared1和shared2。use_count()函数可以获取指向同一对象的shared_ptr数量。
5.2 unique_ptr
unique_ptr也是一种智能指针,但是它是独占的,不能被共享。
使用unique_ptr的示例如下:
auto unique = std::make_unique<int>();
std::unique_ptr<int> unique1(std::move(unique));
std::cout << *unique1 << std::endl; // output: 0
std::cout << *unique << std::endl; // crash
这个示例中,创建了一个unique_ptr<int>类型的智能指针unique,并且将它的拥有权转移给了另一个unique_ptr<int>类型的智能指针unique1。因为unique_ptr是独占的,所以不能同时拥有多个unique_ptr指针指向同一个对象。