become-expert-in-cpp

notes-on-effective-cpp
----------------------
item13 以对象管理资源(RAII)
  1)[ Lambda + tr1::function ] VS [ auto_ptr ]   

item32 确定你的public继承正确模塑出is-a关系

item35 考虑virtual以外的方案
  1)
  2)

item


notes-on-more-effective-cpp
---------------------------
item01 指针和引用
  1)指针可以指向空值,引用必须在初始化时就指定对象
  2)指针可以变更指向的对象,引用从始至终无法改变

item02 尽量使用C++风格的类型转换
  1)static_cast(first_number)
  2)const_cast(&csw)
  3)dynamic_cast(pw)
  4)reinterpret_cast(&do_something)

item03 不要对数组使用多态
  @@a[i]的指针算法还很原始

item04 避免无用的缺省构造函数
  合理:行为特性与数字相仿的对象被初始化为空值或不确定的值
        链表、哈希表等数据结构初始化为空容器
  不合理:无意义

  禁止缺省构造函数的不方便之处
    1)数组
    2)无法在许多基于模板的容器类使用
       template
       class Array {
       public:
         Array(int size);
         ...
       private:
         T* data; 
       };

       template
       Array::Array(int size)
       {
         data = new T[size]; //为每个数组元素依次调用T::T()
       }
    3)虚基类的设计

item16 80-20 rule
  @@多数人遇到性能问题时都会信心满满的快速猜出瓶颈所在,
  @+通常的后果是陷入越来越深的泥沼中,索性推倒重来,从
  @+一开始就使用profiler

item17 Lazy Evaluation
  据说具有五年工龄的C++程序员才具有这种意识
  1)C++ string类的COW机制
  2)惰性数据库读取

item18 over-eager evaluation
  1)cache 
  2)prefetch

item19 临时对象
  1)call-by-value
  2)call-by-reference-to-const
  3)函数返回对象

item20 返回值优化
  1)C++11貌似解决了这个问题
     @@学习计算机以来第一次觉得这是我们的时代的感觉

item21 通过重载避免隐式类型转换
  @@以前从来没见识过这种方法
  @@每一个重载的operator必须带有一个用户自定义类型的参数,
  @+防止用户定义出类似const Type operator+(int a, int b)
  @+这样扰乱内置类型的操作

item22 用operator+=实现operator+
  @@以前不熟悉这种用法  

item23 考虑变更程序库
  @@举了个例子用stdio代替iostream
  @+不过貌似通过替代库提升效率的
  @+可用性不大

item24 理解虚函数、多重继承、虚基类和RTTI
  @@vtable:该类和父类里所有的虚函数指针表
  @+        一个类应该只有一份拷贝
  @@  vptr:从对象找到正确vtable的指针
  @+        嵌入到每个对象中  


Modern-CPP-design
-----------------
  1) policy based class design(编译器策略模式?)
     do-it-all接口?
       @@面向接口 | 组合优于继承 | 可插拔 == 策略模式??
     多重继承是救世主么?
     policy接口和class接口的不同?
       定义“怎样的语法构造符合其所规范的class”而非“必须实现哪些函数”
       @@policy似乎更加贴近设计更加抽象

  2)智能指针
     使指针具备值语义(比如int)
     |-- 拥有权
     |   |-- Deep Copy(拷贝指针时同时拷贝指向的对象)
     |   |   |-- 保持多态性?vtable中加入clone多态行为
     |   |   
     |   |-- Copy on Write
     |   |   |-- !!没办法!!
     |   |
     |   |-- Reference Counting
     |   |   |-- reference-count放在哪里?
     |   |   |   独立存在 | 简单的wrapper类 | 侵入到被指向对象
     |   |
     |   |-- Destructive Copy(std::auto_ptr)
     |       |-- 转移资源
     |
     |-- 隐式转换(smart pointer至raw pointer的转换)
     |   |-- 确定要放弃我们精心实现的管理机制么?GetImpl
     | 
     |-- 相等性和不相等性
     |
     |-- Checking(初始化空值 | deference前测试)
     |
     |-- const语义
     |
     |-- 数组
     |
     |-- 多线程

     声明
       template
       <
         typename T,
         template  class OwnershipPolicy = RefCounted,
         class ConversionPolicy = DisallowConversion,
         template  class CheckingPolicy = AssertCheck,
         template  class StoragePolicy = DefaultSPStorage
       >
       class SmartPtr;


The-Design-and-Evolution-of-C++
-------------------------------
TODO


Google-CPP-style
----------------
class
  |-- 构造函数
  |   |-- 构造函数体绝对不要调用virtual函数或者造成致命错误
  |  
  |-- 缺省构造函数
  |   |-- 如果没有其他的构造函数,则必须自定义一个构造函数,将
  |       成员变量初始化为一个可控连续的状态
  |
  |-- explicit
  |   |-- 所有的单参数构造函数必须用explicit限制
  |   |-- 使用强制转型解决带来的不便
  |
  |-- 禁止拷贝构造函数和赋值运算符重载
  |   |-- STL容器中存储智能指针
  |   |-- 函数以指针或引用形式传递参数
  |
  |-- 继承
  |   |-- 实现继承造成基类与子类之间的紧耦合-使用组合代替
  | 
  |-- 接口
  |
  |-- 操作符重载(禁止)
  |  
  |-- 访问控制(私有)
  |
  |-- 声明顺序(友元函数放在private中)
  |   |-- typedefs and enum
  |   |-- static/const成员
  |   |-- constructor
  |   |-- destructor
  |   |-- method(包括静态方法)
  |   |-- 数据成员
  |       
  |-- write small and focused functions  



Composition-versus-Inheritance
------------------------------
 inheritance是is-a的关系
 composition是has-a的关系
 TODO

转载于:https://www.cnblogs.com/Anney/archive/2012/12/30/2840069.html

你可能感兴趣的:(c/c++,数据库,数据结构与算法)