现代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

直接返回对象呢,因为有返回值优化,其实效率上也不会差很多。

posted @   Destiny233  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示