《More-Effective-C++》读书笔记
技术
条款25 将constructor和non-member functions虚化
virtual constructor并非是指构造函数为虚函数(也不允许),而是指某种函数,给定不同的输入参数,返回不同的类型的对象,典型例子为clone函数,返回基类指针,指向不同的子类。
将非成员函数虚化的做法:写一个虚函数做实际多态工作,然后用非成员函数调用该虚函数。
条款26 限制某个class所能产生的对象数量
- 单例模式, static member。
- 使用一个用于计算对象个数的Base Class将统计对象个数的任务委托出去,类使用者对控制对象个数无感知,但是定义给出count上限。
条款27 要求(或禁止)对象产生于heap之中
析构函数设为private可以限制对象生成在heap中,因为私有的析构函数会使none-heap object在其生命周期结束时隐形调用的析构函数这一行为非法。但是私有析构函数这一做法会影响继承, 改为protect可以解决这一问题。
条款28 Smart Pointers(智能指针)
- 智能指针借助RAII技术,可以保证资源的释放,这一点比原生指针(又称dumb point)好用很多。
auto_ptr这一智能指针并不建议用,一些C++编程规范里建议不使用或禁止使用auto_ptr,而是建议使用unique_ptr和shared_ptr。
条款29 Reference counting(引用计数)
没太看懂重点在哪里。
条款30 Proxy Classes(替身类、代理类)
可以利用proxy classes类技术区分[]的读写动作,是一个lazy evaluation操作。
条款31 让函数根据一个以上的对象类型来决定如何虚化
描述了double dispatch的解决方案。
方法于虚函数实现机理类似,构建并维护不依赖应用类的第三方virtual table类,存放具体类别和对应调用函数的map数组,实现多个动态类型的虚化问题。