掌握现代C++核心新特性(上)

掌握现代C++核心特性(上)

1. 智能指针工厂:make_uniquemake_shared (C++14起)
  • 为何使用? 避免显式使用new提升异常安全性并减少代码冗余。
  • 核心优势:
    • 消除重复类型声明:编译器自动推导类型,避免 std::unique_ptr<MyClass>(new MyClass(...)) 的冗余。
    • 编译加速 & 代码精简:减少重复类型信息,降低编译开销和最终二进制大小。
    • make_shared 的额外优势:通常单次内存分配同时创建对象和控制块,效率更高(但也延长了控制块生命周期)。
  • 最佳实践: 优先使用 make_uniquemake_shared 替代直接 new + 智能指针构造函数。
2. 性能利器:移动语义与 std::move() (C++11起)

移动语义彻底改变了资源管理方式,告别不必要的深拷贝

功能核心价值
大幅提升性能避免昂贵资源(内存、文件句柄、网络连接等)的深拷贝,仅转移所有权。
转移资源所有权源对象资源被“搬空”(进入有效但未指定状态),目标对象接管所有权。
优化临时对象高效处理函数返回值,极大提升 STL 容器(如 vector::push_back)操作效率。

关键点: std::move() 本身不移动任何东西!它仅将左值无条件转换为右值引用,告知编译器“此对象可被移走资源”。

3. 安全之选:四种强制类型转换操作符 (C++11起)

摒弃C风格强制转换 (type)expr,使用更安全、意图明确的转换操作符:

操作符核心用途安全性说明
reinterpret_cast底层位模式重新解释(如:指针↔整数、不同类型指针互转)。最强大也最危险,极易引发未定义行为。
static_cast基本类型转换、void*↔具体类型指针、有继承关系的类指针/引用向上/向下转换(向下转换无运行时检查)。相对安全,编译时检查。
const_cast修改类型的 constvolatile 属性(“常量性”)。谨慎使用,主要用于兼容旧接口。
dynamic_cast运行时安全的类层次间向下或交叉转换(指针转换失败返回 nullptr,引用转换失败抛出 std::bad_cast)。最安全(需RTTI支持,有运行时开销)。

核心准则: 优先选择限制最多的可行转换操作符(例如,能用 static_cast 就不用 reinterpret_cast)。

4. 类型萃取利器:std::remove_pointer (C++11起)
  • 头文件: <type_traits>
  • 作用:T 是指针类型(如 int*, const MyClass*),则提供成员 type 为其指向的类型(int, const MyClass);若 T 非指针,则 type 即为 T 本身。
  • 典型应用: 在模板元编程中,需要剥离指针修饰符获取底层类型时非常有用。
using PtrType = int*;
using BaseType = std::remove_pointer<PtrType>::type; // BaseType 是 int
5. 简化访问:结构化绑定 (C++17起)

轻松解包结构体、元组(std::tuple)、数组、std::pair 等复合类型成员到独立变量。

std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}, {3, "three"}};
// 清晰解包 key 和 value
for (const auto& [key, value] : myMap) { //  注意: 是 & [ ] 符号
    std::cout << "key:" << key << ", value:" << value << std::endl;
}

要点:

  • 绑定变量数量必须严格匹配结构体成员数、元组大小等。
  • 主要用于静态结构(编译期确定成员数量和类型),不适用于运行时动态变化的数据结构
6. 文件系统新标准:std::filesystem (C++17起)
  • 头文件: <filesystem> (常用别名 namespace fs = std::filesystem;)
  • 价值: 提供跨平台类型安全的文件和目录操作库,告别平台特定API(如Win32 API, POSIX)。
  • 核心功能:
    • 路径操作: fs::path 类及其方法(/操作符拼接、filename()extension()parent_path()等)。
    • 查询与操作:
      • 创建:create_directory, create_directories (递归创建)
      • 删除:remove (文件/空目录), remove_all (递归删除)
      • 检查:exists, is_directory, is_regular_file, is_symlink
    • 文件信息: file_size, space (获取磁盘空间)
    • 文件操作:
      • 复制:copy, copy_file (可控制覆盖行为), copy_symlink
      • 移动/重命名:rename, 移动语义的 fs::path 赋值
    • 目录遍历:
      • fs::directory_iterator (单层遍历)
      • fs::recursive_directory_iterator (递归遍历)
    • 属性与权限: last_write_time (最后修改时间), permissions (设置/获取权限)
    • 错误处理: 使用 std::error_code 参数或抛出 fs::filesystem_error 异常。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

star _chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值