现代C++编程实战(2)
异常
异常安全:当发生异常时,没有资源泄露,系统也不会处于不一致状态
-
如果不知道是否使用异常,那就是该用。
-
直接throw会导致内存泄漏,才会使用try catch
-
在大部分情况下,提供了强异常保证
迭代器
迭代器不是一种类型,而是一种类型要求。
- 迭代器要求支持*,++,==,!=运算符
- 输入迭代器仅仅要求支持单次*
- 前向迭代器要求多次*
- 双向迭代器要求--
- 随机访问迭代器要求-=,+=,[]
自动类型推断
auto
- auto a = expr 相当于匹配一个template<typanem T> f(T)模板
- auto&& a = expr 相当于匹配一个template<typename T> f(T&&)模板,可能会导致引用坍缩
- 多返回值,auto[xx, xx] = func(),返回pair或者tuple
decltype
- decltype(变量) 获得变量的类型,并作为一个新的变量
- decltype(表达式)
- decltype(auto) a = expr(用于转发函数,防止坍缩)
初始化
- 初始化列表,vector<int> v
- 统一初始化,用{}而非()
- 类成员在声明时可直接赋初值
字面量
- 自定义字面量:constexpr long double operator"" _mm(long double x)
静态断言
- assert:c++98提供,在运行时判断断言
- static_asser:在编译阶段就直接
成员函数说明
编译器默认生成的:构造,析构,拷贝,拷贝赋值,移动,移动赋值
- default
- delete
- override:只有重写虚函数才能编译通过
- final:声明成员函数是虚函数,但不可被重写
返回对象
一个用来返回的对象,一般是可以移动,可拷贝的。
-
C语言的做法:返回错误码,用户负责分配内存,接口负责构造。让用户做内存管理是很不好的行为!
-
一个稍微好一点的做法:接口负责对象的构造与析构,用户调用接口即可。代码会很啰嗦,因为需要处理不同错误下的资源释放。
-
用C++的异常简化:用shared_ptr
直接返回对象呢,因为有返回值优化,其实效率上也不会差很多。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通