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 << ' ';
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值