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 << ' ';
}
相关推荐
oem1102 小时前
C++中的享元模式实战
开发语言·c++·算法
casual~4 小时前
第?个质数(埃氏筛算法)
数据结构·c++·算法
Elnaij4 小时前
从C++开始的编程生活(20)——AVL树
开发语言·c++
hanbr4 小时前
【C++ STL核心】vector:最常用的动态数组容器(第九天核心)
开发语言·c++
仰泳的熊猫4 小时前
题目2308:蓝桥杯2019年第十届省赛真题-旋转
数据结构·c++·算法·蓝桥杯
lzksword5 小时前
C++ Builder XE OpenDialog1打开多文件并显示xls与xlsx二种格式文件
java·前端·c++
niceffking6 小时前
C++内部类的ISO约定和语法细节
开发语言·c++
艾莉丝努力练剑6 小时前
【脉脉】AI创作者崛起:掌握核心工具,在AMA互动中共同成长
运维·服务器·c++·人工智能·安全·企业·脉脉
码界奇点7 小时前
基于ASP.NET Core的内容管理系统设计与实现
c++·后端·车载系统·毕业设计·asp.net·源代码管理
2401_883035467 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法