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 << ' ';
}
相关推荐
薄荷故人_6 分钟前
从零开始的C++之旅——红黑树封装map_set
c++
悲伤小伞34 分钟前
C++_数据结构_详解二叉搜索树
c语言·数据结构·c++·笔记·算法
m0_675988232 小时前
Leetcode3218. 切蛋糕的最小总开销 I
c++·算法·leetcode·职场和发展
code04号5 小时前
C++练习:图论的两种遍历方式
开发语言·c++·图论
煤泥做不到的!6 小时前
挑战一个月基本掌握C++(第十一天)进阶文件,异常处理,动态内存
开发语言·c++
F-2H6 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
axxy20007 小时前
leetcode之hot100---24两两交换链表中的节点(C++)
c++·leetcode·链表
若亦_Royi8 小时前
C++ 的大括号的用法合集
开发语言·c++
ragnwang11 小时前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
lqqjuly14 小时前
特殊的“Undefined Reference xxx“编译错误
c语言·c++