C++11 新特性
C++11 是 C++ 语言历史上一个重要的版本,它引入了许多现代化的语言特性,大大简化了 C++ 开发。
1.自动类型推导(auto
)
自动推导变量的类型,减少了类型声明的冗余。
auto x = 10; // 自动推导为 int
2.范围循环(Range-based for loops)
遍历容器的新语法,简化迭代器使用。
for (int i : arr) {
std::cout << i;
}
3.智能指针(std::shared_ptr
和 std::unique_ptr
)
引入智能指针来管理动态内存,避免内存泄漏。
4.lambda 表达式(Lambda Expressions)
内联定义匿名函数,减少函数对象和回调的冗余代码。
auto add = [](int a, int b) { return a + b; };
5.右值引用和移动语义(Rvalue References & Move Semantics)
提高对象转移的效率,减少不必要的拷贝。
std::vector<int> v1 = std::move(v2); // v2 的资源被移动到 v1
6.线程库(<thread>
)
标准化了多线程编程,提供了线程类、互斥量、条件变量等。
std::thread t([] { std::cout << "Hello, World!"; });
t.join();
7.常量表达式(constexpr
)
允许在编译时计算常量,提高性能。
constexpr int square(int x) { return x * x; }
8.枚举类(enum class
)
强类型枚举,避免普通枚举的隐式类型转换。
enum class Color { Red, Green, Blue };
9. 列表初始化(List Initialization)
//使用花括号 {} 可以初始化内置类型变量:
int x{5}; // 初始化为 5
double d{3.14}; // 初始化为 3.14
char c{'A'}; // 初始化为 'A'
//初始化数组和容器
int arr[] = {1, 2, 3, 4, 5}; // 初始化数组
std::vector<int> vec{1, 2, 3, 4, 5}; // 初始化 vector
std::map<std::string, int> m{
{"apple", 1},
{"banana", 2},
{"cherry", 3}
}; // 初始化 map
//防止窄化转换
int x1 = 3.14; // 允许,x1 的值为 3,发生了隐式转换
int x2{3.14}; // 错误,编译器会报错,防止窄化转换
double d1 = 1e40f; // 允许,从 float 转为 double
float f1{1e40}; // 错误,1e40 超出了 float 的范围
//初始化类对象
//列表初始化可以用于初始化类对象,包括使用构造函数和聚合类型初始化:
class Point {
public:
int x;
int y;
Point(int x_val, int y_val) : x{x_val}, y{y_val} {}
};
Point p1{10, 20}; // 使用构造函数初始化
//对于没有用户定义构造函数的聚合类型,也可以使用列表初始化:
struct Person {
std::string name;
int age;
};
Person p2{"Alice", 30}; // 直接初始化结构体成员
//列表初始化可以与 std::initializer_list 结合使用,允许类接收初始化列表作为参数:
class MyVector {
public:
std::vector<int> data;
MyVector(std::initializer_list<int> il) : data(il) {}
};
MyVector mv{1, 2, 3, 4, 5}; // 使用初始化列表构造 MyVector 对象
//使用空的花括号 {} 可以对变量进行值初始化(Value Initialization):
int n{}; // n 初始化为 0
double d{}; // d 初始化为 0.0
std::string s{}; // s 初始化为空字符串
int* ptr{}; // ptr 初始化为 nullptr
C++20 新特性
C++20 是继 C++11 之后又一个重要的版本,引入了大量新特性,尤其是协程和概念(Concepts)。
1.协程(Coroutines)
通过 co_await
、co_yield
和 co_return
实现异步编程模型。
Task async_func() {
co_await some_task();
}
2.概念(Concepts)
用于限制模板参数的类型,提高模板代码的可读性和调试能力。
template<typename T>
concept Integral = std::is_integral_v<T>;
template<Integral T>
T add(T a, T b) {
return a + b;
}
3.范围库(Ranges Library)
大幅提升标准库对集合操作的支持,允许对容器执行类似 filter
、map
、reduce
的操作。
std::vector<int> v = {1, 2, 3, 4, 5};
auto result = v | std::views::filter([](int n) { return n % 2 == 0; });
4.三路比较运算符(<=>
)
引入 "太空飞船" 操作符,实现全面的比较运算。
struct Point {
int x, y;
auto operator<=>(const Point&) const = default;
};
5.模块化(Modules)
模块化系统提供了比头文件更加高效的代码组织和编译方式。
export module math;
export int add(int a, int b) {
return a + b;
}
6.constexpr
的扩展
允许更多的标准库函数(如 std::vector
等)在 constexpr
上下文中使用。
7.std::span<T>
表示对数组、容器的视图,避免拷贝操作。
void print(std::span<int> data) {
for (int i : data) std::cout << i << ' ';
}