C++11是C++语言的一个重要版本,在2003年C++98标准发布后的8年后发布,C++11带来了许多有用的新特性和语言改进。以下是C++11之后重要的新特性:
1. 自动类型推断
C++11引入了auto关键字,使得编译器能够根据初始化的值自动推断变量的类型,例如:
auto x = 5; // x被自动推断为int类型
auto y = 3.14; // y被自动推断为double类型
这样可以更方便地声明变量,并且减少了代码中类型重复声明的冗余。需要注意的是,auto不能用于函数参数、类成员变量和非静态变量的初始化。
2. Lambda表达式
Lambda表达式是C++11的另一个重要特性,它允许在函数内部定义匿名函数,并且可以捕获函数外部的变量。例如:
auto lambda = [](int x, int y) { return x + y; };
int result = lambda(2, 3); // result的值为5
在Lambda表达式中,方括号内的内容用于指定要捕获的变量,在例子中,捕获了函数外的变量 x 和 y。这使得Lambda表达式非常方便,可以在不将函数声明成成员函数的情况下,定义局部的可调用对象。
3. 智能指针
C++11引入了三种智能指针:unique_ptr、shared_ptr和weak_ptr。智能指针是指能够自动管理内存的指针,它可以自动释放分配的内存,避免了内存泄漏和悬挂指针的问题。unique_ptr表示独占所有权,shared_ptr表示共享所有权,weak_ptr表示弱引用,可以防止强引用导致内存泄漏。
std::unique_ptr<int> p1(new int); // 创建unique_ptr对象
std::shared_ptr<int> p2(new int); // 创建shared_ptr对象
std::weak_ptr<int> wp1 = p2; // 创建weak_ptr对象
4. 列表初始化
C++11引入了列表初始化语法,可以使用花括号初始化任何类型的对象,例如:
int arr[] = {1, 2, 3}; // 列表初始化数组
std::vector<int> v = {4, 5, 6}; // 列表初始化vector容器
这种初始化方式使得代码更加简洁,同时可以避免一些语法错误,例如隐式类型转换、精度丢失等。
5. Range-based for循环
C++11引入了Range-based for循环,可以方便地遍历容器、数组等序列类型,例如:
std::vector<int> v = {1, 2, 3};
for (auto i : v) { // 遍历vector容器
std::cout << i << std::endl;
}
int arr[] = {4, 5, 6};
for (auto& i : arr) { // 遍历数组
i *= 2;
}
这种循环方式使代码更加简洁,在遍历序列类型时非常方便。
以上是C++11之后重要的新特性,这些特性可以使代码更加简洁、安全、高效,也为C++的应用带来了更大的灵活性。