C++14 和 C++17 的核心新特性

一、C++14 的新特性

  1. std::make_unique
    作用:更方便地创建 unique_ptr(独占式智能指针)。
    以前只能用 std::unique_ptr(new T(...)),现在可以直接用 make_unique。
cpp 复制代码
// 以前
std::unique_ptr<int> p1(new int(42));

// C++14
auto p2 = std::make_unique<int>(42);  // 更安全、更简洁

💡 好处:避免忘记 delete,而且异常安全。

  1. 标准库支持读写锁(shared_mutex 和 shared_lock)
    作用:允许多个线程同时读,但只有一个线程写。适合"读多写少"的场景。
cpp 复制代码
std::shared_mutex mtx;
// 读锁:多个线程可以同时持有
std::shared_lock read_lock(mtx);
// 写锁:独占
std::unique_lock write_lock(mtx);
  1. std::exchange
    作用:原子地用一个新值替换一个对象,并返回原值(一步完成)。
cpp 复制代码
int a = 10;
int old = std::exchange(a, 20);
// old == 10, a == 20

常用于移动赋值、交换指针等。

  1. 原始字符串字面量 R"(...)"
    作用:不用再转义字符串里的引号和反斜杠,写起来更干净。
cpp 复制代码
// 普通字符串要转义
std::string s1 = "C:\\Program Files\\"abc\"";

// 原始字符串:R"delimiter(内容)delimiter"
std::string s2 = R"(C:\Program Files\"abc")";
std::cout << s2;   // 输出 C:\Program Files\"abc"
  1. 二进制字面量 0b01011101
    作用:直接写二进制数字,方便位运算。
cpp 复制代码
int mask = 0b00001111;  // 15
int val = 0b1010;       // 10

以前只能用十六进制 0x0F 或十进制 15,现在可以直接写二进制位。

  1. 数字分隔符 ' (单引号)
    作用:让大数字更容易阅读,编译器会自动忽略单引号。
cpp 复制代码
int million = 1'000'000;      // 1000000
int magic = 0b1111'0000'1010; // 二进制分组

二、C++17 的新特性

  1. if 和 switch 里可以直接初始化变量
    作用:把变量的作用域限制在 if/switch 内部,代码更清晰。
cpp 复制代码
// 以前
{
    int* p = get_ptr();
    if (p != nullptr) {
        // 使用 p
    }
}

// C++17
if (int* p = get_ptr(); p != nullptr) {
    // 使用 p,p 只在这个 if 里有效
}

switch 也一样:

cpp 复制代码
switch (Status s = get_status(); s) {
    case OK: ... break;
    case ERR: ... break;
}
  1. std::string_view
    作用:一个"只读的字符串视图",不拷贝数据,只指向原有字符串的一部分。性能高,内存小。
cpp 复制代码
std::string s = "hello world";

// 以前:传 string 会拷贝,传 const char* 不方便
// C++17:string_view 只保存指针和长度
std::string_view sv = s;           // 不拷贝
std::string_view part = s.substr(6, 5); // 指向 "world",不产生新字符串

💡 使用场景:函数参数、字符串切割。注意:string_view 不管理生命周期,原字符串销毁后它就失效了。

相关推荐
techdashen1 小时前
深入理解 Rust Futures:从零开始,一头扎到底
开发语言·后端·rust
小欣加油1 小时前
leetcode169 多数元素
数据结构·c++·算法·leetcode·职场和发展
程序猿乐锅1 小时前
【JAVASE | 第十六篇】多线程
java·开发语言
布局呆星2 小时前
Spring Boot + JWT + Spring Security 认证授权实战:双角色、双 Token、方法级权限,一次讲透
java·开发语言
csdndeyeye2 小时前
从Ctrl+C/V到一键填充:AI投简历工具实测
c语言·开发语言·自动化·秋招·ai助手·网申·ai投简历
诸葛大钢铁2 小时前
如何降低Word文件的体积?压缩Word文件的三种方法
开发语言·c#
小白学大数据2 小时前
如何自动追踪 eBay 售价?Python 爬虫实战解析
开发语言·人工智能·爬虫·python
莫逸风2 小时前
【AgentScope】6.文件系统(Filesystem)详解
开发语言·windows·springai·agentscope·agnet
utf8mb4安全女神2 小时前
怎么写shell/bash脚本【if嵌套】【case】【while死循环】【while嵌套if】【for】【随机数】
开发语言·bash