C++11
引入了许多新的特性,这些特性极大地改进了C++的功能性和易用性。下面是一些重要的C++11
特性的例子:
统一初始化语法首次出现在C++11
中,这是一种尝试使所有类型的初始化都能使用相同语法的方式。在C++11
之前,C++中的初始化语法是多样的,取决于正在初始化的对象的类型和上下文。这可能会导致一些混淆和错误。
为了解决这个问题,C++11
引入了统一的初始化语法,也被称为大括号初始化或列表初始化。这种语法使得所有类型的初始化都可以使用相同的语法,无论是内建类型,用户定义的类型,容器,聚合体还是动态数组。
统一初始化语法的基本形式是使用大括号 {}
来包围初始化的值。这可以应用于几乎所有的初始化场景。下面是一些示例:
int x{10}; // 基本类型的初始化
string s{"hello"}; // 类的初始化
vector<int> v{1, 2, 3, 4, 5}; // 容器的初始化
int a[]{1, 2, 3, 4, 5}; // 数组的初始化
统一初始化语法还可以用于动态内存分配:
int* p = new int[5]{1, 2, 3, 4, 5};
以及用于函数返回值:
pair<int, int> foo() {
return {1, 2};
}
C++的统一初始化语法是一种强大而灵活的特性,它简化并统一了初始化语法,降低了编程错误的可能性,使得代码更为易于理解和维护。
在C++11
中,auto
关键字可以用于自动推断变量的类型,这在处理复杂的类型或模板类型时非常有用。例如:
auto x = 42; // x 是 int
auto y = 3.14; // y 是 double
auto z = "Hello, World!"; // z 是 const char*
C++11
引入了范围based for
循环,使得遍历数组或者容器变得更加简单:
vector<int> v = {1, 2, 3, 4, 5};
for (auto i : v) {
cout << i << "\n";
}
Lambda
表达式是一种创建匿名函数对象的方法,这在你需要传递一些简单的函数或者需要在一个函数中定义另一个函数时非常有用:
vector<int> v = {1, 2, 3, 4, 5};
sort(v.begin(), v.end(), [](int a, int b) {
return a > b;
});
在C++11
中,引入了nullptr
来表示空指针,这取代了之前的NULL
。nullptr
是一种特殊类型的字面量,它可以转换为任何指针类型:
int* p = nullptr;
C++11
引入了类型别名模板,这是一种创建模板化类型别名的方法,可以使得代码更加清晰:
template<typename T>
using Vec = std::vector<T>;
Vec<int> v; // 等价于 std::vector<int> v;
以上只是C++11
特性的一部分,其实呢,C++11
引入了许多其他的改进和新特性,如智能指针、线程库支持、正则表达式支持等等,这些都极大地提升了C++的编程效率及程序的性能。(C++11
和C++20
被广泛认为是最具有里程碑意义的两个版本)