每天学习亿点点Day 8.8: C++面向对象开发的一些有趣的点 hj老师yyds
1. 偏特化,全特化,模板模板参数
偏特化: 即一部分固定这种一部分固定有两种意思,
一个是个数的偏
即某些个参数被绑定
另一个是范围的偏:
模板模板参数:
这种模板模板参数其实就是套娃,原始定义中,传进来的类必须是一个确定的类,但是这里可以在此此基础上待定一个参数,但是这个类型每次使用必须要加类进行特化
2. 可变数量参数模板
在typename里面声明的时候用
typename... types来声明
这个时候types就是一个pack
声明完了用这个类型的时候就是
types... args这样来使用
sizeof...(args)这里的sizeof多了三个点
3. 关于const*牛鬼蛇神套娃如何解读
随便举个例子: const int * const * const * pppi;
* pppi
* const
* const
const int
这样就区分开来,pppi就是一个指向const指针A,A指向const指针B,B指向const int.
4. reference 就是用指针实现的,它其实就是指针啦,大小相同,地址也相同,全都是假象.
引用往往都是用于参数类型和返回类型的描述
而且引用和非引用的类型其实是一样的,它们两个的signature其实是一样的,所以两者不能共同存在!
5. 关于this
其实每次成员函数调用的时候都会传入本object的this指针, 所以如果调用了一个虚函数则会调用当前this指针的虚函数. MFC里面的结构就和这个类似
6. vptr和vtable
继承下来就会覆盖基类的相同名字的虚函数,这里其实是虚函数表中的名字在起冲突的时候的处理方式,本身该继承的所有函数都依旧在,无非就是需要class::function的方式来调用
7. const
COW其实就是一个偷懒的机制,当我们不需要去往一位上写一个数据时候,几个指针可能同时共享一段内存,但如果某一个指针需要往里面写东西的时候,需要为这个指针独立复制一份数据并和其它指针断联, 这样其实就是写的时候复制,需要用的时候再复制,就懒.
8. replacement new的重载
其实就是new后面跟一个小括号然后就可以做一些操作。new (...)里面的·东西就是所谓的placement arguments
对应的placement delete也可以重载但不会被delete 调用,只有当new调用的ctor抛出异常的时候才会调用这些重载版本的operator delete()。它只能被这样调用,因为这是为了归还未能完全创建成功的object所占用的memory.