C++ 11概述
引言
C++11 是 C++ 编程语言的一个重要版本更新,于2011年发布。它引入了许多新特性和改进,显著提升了 C++ 的表达能力、性能和安全性。作为 C++98/03 之后的首个主要更新,C++11 标志着 C++ 语言的现代化转型,使得编写高效、清晰和安全的代码变得更加容易。
备注
C++11 之前,C++ 标准通常被称为 C++98 或 C++03(2003年的小更新)。而 C++11 之后,C++ 标准委员会决定采用年份命名方式,后续有 C++14、C++17、C++20 等版本。
C++ 11 的主要改进方向
C++11 的更新主要集中在以下几个方面:
- 提高语言核心可用性:让语言更加易用、表达性更强
- 提升运行时性能:引入更高效的编程模型和性能优化
- 加强抽象能力:改进类型系统和泛型编程
- 增强并发支持:提供标准的多线程支持
核心语言特性
自动类型推导 (auto)
auto
关键字允许编译器自动推导变量的类型,减少冗长的类型声明。
// C++98/03 方式
std::vector<int>::iterator it = vec.begin();
// C++11 方式
auto it = vec.begin(); // 编译器自动推导 it 的类型
基于范围的 for 循环
C++11 提供了一种更简洁的遍历容器的方法。
std::vector<int> numbers = {1, 2, 3, 4, 5};
// C++98/03 方式
for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
// C++11 方式
for (int n : numbers) {
std::cout << n << " ";
}
// 输出(两种方式相同): 1 2 3 4 5
Lambda 表达式
Lambda 表达式允许在代码中定义匿名函数,简化代码并提高可读性。
std::vector<int> numbers = {4, 1, 3, 5, 2};
// C++11 之前,需要定义函数或函数对象
bool sortFunction(int a, int b) {
return a < b;
}
// C++11 使用 lambda 表达式
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a < b;
});
// 打印排序后的结果: 1 2 3 4 5
for (int n : numbers) {
std::cout << n << " ";
}
nullptr
C++11 引入了 nullptr
来替代表示空指针的 NULL
宏,解决了一些类型安全问题。
// C++98/03 方式(可能导致歧义)
void func(int);
void func(char*);
func(NULL); // 歧义:可能调用 func(int) 而非 func(char*)
// C++11 方式
func(nullptr); // 明确调用 func(char*)
强类型枚举 (enum class)
C++11 引入了限定作用域的枚举类型,解决了传统枚举的一些问题。
// 传统枚举,枚举常量泄漏到外部作用域
enum Color { RED, GREEN, BLUE };
// C++11 强类型枚举
enum class NewColor { Red, Green, Blue };
Color c1 = RED; // 正确,但枚举常量在全局作用域
NewColor c2 = NewColor::Red; // 必须使用作用域限定符