现代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
直接返回对象呢,因为有返回值优化,其实效率上也不会差很多。

浙公网安备 33010602011771号