1. 指向函数的指针
    1. typedef bool (*cmpFcn)(const string &, const string &);
    2. 函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值
  2. 关联容器
    1. pair类型
    2. map类型
    3. set类型
    4. multimap类型
    5. multiset类型
      1. 允许一个键对应多个实例
  3. 管理指针
    1. 定义智能指针类
      1. 使用计数(引用计数)
    2. 指针成员提供值语义
    3. 指针型句柄类
  4. 复制未知类型
    1. 定义虚函数clone()
      1. 存在是为了生成类对象的新副本
        1. 抽象类不需要定义clone()
  5. 比较两个Sales_item对象
    1. 定义operator<
    2. 附加的实参传给stable_sort
    3. 定义容器对象
      1. 定义比较函数
        1. inline bool compare(const Sales_item &lhs,const Sales_item &rhs)
      2. 定义类型别名
        1. typedef bool (*Comp)(const Sales_item&, const Sales_item&);
      3. 定义multiset
        1. std::multiset<Sales_item,Comp>items(compare);
  6. 句柄类
    1. 实例1
      1. Sales_item类(句柄类,用于管理指针)
        1. 第一个构造函数:默认构造函数创建未绑定的Sales_item对象
          1. Sales_item():p(0),use(new std::size_t(1))
        2. 第二个构造函数:接受一个对象,并将句柄与其关联
          1. Sales_item(const Item_base& item):p(item.clone()),use(new std::size_t(1))
      2. Item_base类(不使用折扣策略基类)
        1. Sales_item类(句柄类,用于管理指针)
          1. 第一个构造函数:默认构造函数创建未绑定的Sales_item对象
          2. Sales_item():p(0),use(new std::size_t(1))
          3. 第二个构造函数:接受一个对象,并将句柄与其关联
          4. Sales_item(const Item_base& item):p(item.clone()),use(new std::size_t(1))
        2. 计数器 use
        3. 每个基类增加虚函数clone()
        4. Basket类(带比较器的关联容器)
          1. 定义容器对象
          2. 定义比较函数
          3. inline bool compare(const Sales_item &lhs,const Sales_item &rhs)
          4. 定义类型别名
          5. typedef bool (*Comp)(const Sales_item&, const Sales_item&);
          6. 定义multiset
          7. std::multiset<Sales_item,Comp>items(compare);
        5. 本质:用户不必管理句柄指向的对象(即Item_base,Bull_item,Lds_item类对象),Sales_item类将完成这部分工作。当用户通过Sales_item类对象调用函数时,将获得多态行为
        6. Disc_item抽象基类(实行折扣率和可实行折扣策略的数量)
          1. Bulk_item类(批量购买折扣类)
          2. Lds_item类(有限折扣类)
      3. Disc_item抽象基类(实行折扣率和可实行折扣策略的数量)
        1. Bulk_item类(批量购买折扣类)
        2. Lds_item类(有限折扣类)
      4. 计数器 use
      5. 每个基类增加虚函数clone()
      6. Basket类(带比较器的关联容器)
        1. 定义容器对象
          1. 定义比较函数
          2. inline bool compare(const Sales_item &lhs,const Sales_item &rhs)
          3. 定义类型别名
          4. typedef bool (*Comp)(const Sales_item&, const Sales_item&);
          5. 定义multiset
          6. std::multiset<Sales_item,Comp>items(compare);
      7. 本质:用户不必管理句柄指向的对象(即Item_base,Bull_item,Lds_item类对象),Sales_item类将完成这部分工作。当用户通过Sales_item类对象调用函数时,将获得多态行为
    2. 实例2
      1. eval虚函数
      2. Query(句柄类)
        1. 三个重载重载操作符
        2. 构造函数(动态分配新Query_base对象)
        3. 不定义解引用,箭头操作符
      3. 计数器
      4. WordQuery
      5. Query_base(抽象基类)
        1. TextQuery
        2. display虚函数
        3. eval虚函数
        4. Query(句柄类)
          1. 三个重载重载操作符
          2. 构造函数(动态分配新Query_base对象)
          3. 不定义解引用,箭头操作符
        5. 计数器
        6. WordQuery
        7. NotQuery
        8. BinaryQuery(抽象类)
          1. AnyQuery
          2. OrQuery
      6. NotQuery
      7. TextQuery
      8. BinaryQuery(抽象类)
        1. AnyQuery
        2. OrQuery
      9. display虚函数
  7. 泛型编程
    1. 模板形参作用域
      1. 常规名字屏蔽规则
    2. 使用限制
      1. 不能在模板内部重用
      2. 模板形参的名字只能在同一模板形参表中使用一次
    3. 模板声明
      1. 可以只声明不定义
      2. 同一模板的声明和定义中,模板形参的名字不必相同
    4. 模板类型形参
      1. typename与class区别
        1. typename直观但是后加入
      2. 作为类型
        1. 在成员名前加上关键字typename::
    5. 实例化
      1. 类模板的形参是必须的
      2. 函数模板实例化