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

相关推荐
用户805533698038 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK21 小时前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境1 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境1 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴2 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境4 天前
C++ 的Eigen 库全解析
c++
卷无止境4 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴4 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18006 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴6 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake