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 不管理生命周期,原字符串销毁后它就失效了。

相关推荐
C++ 老炮儿的技术栈1 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
new_zhou1 小时前
C++ 项目 AI 协作指南(Windows / MSVC 环境)
c++·人工智能·windows
二十雨辰2 小时前
[Java]-Spring面试题
java·开发语言
萧瑟余晖2 小时前
Java深入解析篇二十二之虚拟线程
java·开发语言
油丶酸萝卜别吃3 小时前
Java 集合类全景介绍
java·开发语言
水饺编程3 小时前
AT&T 汇编语言学习笔记开篇语
c语言·汇编·c++
Iruoyaoxh3 小时前
类和对象~
开发语言·c++
程序喵大人3 小时前
【C++进阶】STL算法与函数对象 - 04 find、count和any_of把查询写成意图
开发语言·c++·算法
豆沙沙包?3 小时前
c++中引用(P7-P11)
java·c++·算法
Livia要学习3 小时前
Python装饰器
开发语言·python