掌握现代C++核心特性(上)
1. 智能指针工厂:make_unique 与 make_shared (C++14起)
- 为何使用? 避免显式使用
new,提升异常安全性并减少代码冗余。 - 核心优势:
- 消除重复类型声明:编译器自动推导类型,避免
std::unique_ptr<MyClass>(new MyClass(...))的冗余。 - 编译加速 & 代码精简:减少重复类型信息,降低编译开销和最终二进制大小。
make_shared的额外优势:通常单次内存分配同时创建对象和控制块,效率更高(但也延长了控制块生命周期)。
- 消除重复类型声明:编译器自动推导类型,避免
- 最佳实践: 优先使用
make_unique和make_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 | 修改类型的 const 或 volatile 属性(“常量性”)。 | 谨慎使用,主要用于兼容旧接口。 |
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异常。
- 路径操作:
946

被折叠的 条评论
为什么被折叠?



