C++ 新特性

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_ptrstd::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_awaitco_yieldco_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)

大幅提升标准库对集合操作的支持,允许对容器执行类似 filtermapreduce 的操作。

复制代码
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)

模块化系统提供了比头文件更加高效的代码组织和编译方式。

C++20 模块化(Modules)-CSDN博客

复制代码
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 << ' ';
}
相关推荐
HellowAmy4 小时前
我的C++规范 - 玩一个小游戏
开发语言·c++·代码规范
自学不成才4 小时前
深度复盘:一次flutter应用基于内存取证的黑盒加密破解实录并完善算法推理助手
c++·python·算法·数据挖掘
玖釉-6 小时前
[Vulkan 学习之路] 08 - 给图片穿马甲:图像视图 (Image Views)
c++·windows·图形渲染
m0_748250037 小时前
C++ 信号处理
c++·算法·信号处理
yuyanjingtao7 小时前
动态规划 背包 之 凑钱
c++·算法·青少年编程·动态规划·gesp·csp-j/s
scx201310048 小时前
20260112树状数组总结
数据结构·c++·算法·树状数组
星竹晨L8 小时前
【C++内存安全管理】智能指针的使用和原理
开发语言·c++
智者知已应修善业8 小时前
【C语言 dfs算法 十四届蓝桥杯 D飞机降落问题】2024-4-12
c语言·c++·经验分享·笔记·算法·蓝桥杯·深度优先
玖釉-9 小时前
[Vulkan 学习之路] 09 - 显卡的流水线工厂:图形管线概览 (Graphics Pipeline)
c++·windows·图形渲染
无限进步_10 小时前
【C语言&数据结构】二叉树遍历:从前序构建到中序输出
c语言·开发语言·数据结构·c++·算法·github·visual studio