二十二、Template Method模式
1. 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤;
2. 这是一种中级控制机制,通常使用基类的共有非虚函数,调用保护的虚函数,派生类可以重新实现基类的虚函数,达到依照框架重新制定执行方式的目的。
二十三、名字空间
1. 使用名字空间防止命名冲突;
2. 使用名字空间通常使用名字空间::限定符来使用内部成员;
3. 在使用名字空间时,尽量约束在较小的范围内,并且使用哪个定义哪个,例如不应该using namespace std,而应该使用using ::std::list这样的风格,另外名字空间别名化也尽量不要使用;
4. 匿名名字空间只能够在其预编译出现的文件中被使用,就如静态对象类似。
二十四、成员函数查找
1. 调用一个函数时,涉及三个步骤,编译器查找函数的名字,从可用候选者中选择最佳匹配函数,检查是否具有访问该匹配函数的权限;
2. C++内层作用域会覆盖外层作用域,java内层作用域和外层作用域是重载的关系;
3. 注意命名规范,养成良好的习惯。
二十五、实参相依的查找
1. 简称ADL,当查找一个函数调用表达式中的函数名字时,编译器也会到“包含函数调用实参的类型”的名字空间中检查。
二十六、操作符函数查找
1.直接调用操作符时,遵循普通的函数查找规则;使用中缀语法调用操作符时,编译器也会考虑实参所在那个的命名空间。
二十七、能力查询
1. 当需要知道一个类是否是从另外一个类继承的,或者间接继承的,或者多继承自A和B,可以使用dynamic_cast进行间接横向转型,如果不是,则为空指针;
2. 最好避免对一个对象的能力进行运行期查询,因为这不是一个良好的设计和实现方式。
二十八、指针比较的含义
1. 在C++中,一个对象可以有多个有效的地址,因此,指针比较的不是地址,而是对象同一性问题,比较的地址,通常也是相对偏移量得到的地址;
2. 当我们处理指向对象的指针或引用时,必须小心避免丢失类型信息,避免转向void,否则比较可能就会是错误的。
二十九、虚构造函数与Prototype模式
1. 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现。
2. Prototype模式和Builder模式、AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory模式重在产生多个相互依赖类的对象,而Prototype模式重在从自身复制自己创建新类。
3.迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解。
三十、Factory Method模式
1. 使用Factory Method模式通常意味着一个高级设计需要基于一个对象的确切类型产生另一个“适当”的对象,这样的需要往往发生于存在多个平行或几乎平行的类层次结构的情况下。
http://blog.csdn.net/u011822862/article/details/78714605
三十一、协变返回类型
1. 指的是重写的函数的返回类型根据子类重新定义,但是必须和父类的返回类型是继承关系;
2. 协变返回机制将我们从这样一种处境中解脱出来:不得不使用易于出错的转型(从父类返回类型转到当前需要类型)操作来“重新”提供类型信息,而这些信息是一开始就具有的。
三十二、禁止复制
1. 将复制构造函数和复制赋值操作符显式声明为private的,防止编译器将他们声明成公有、内联的成员;
2. C++中有很多线程的库支持这种禁止操作,例如Qt的Q_DISABLE_COPY () ,boost的noncopyable。
三十三、制造抽象基类
1. 四种方式:
1)没有纯虚函数时,将构造和复制构造声明为保护成员;
2)没有合适纯虚函数,将析构写为纯虚函数,但是需要具有默认实现;
3)没有纯虚函数时,将析构声明为保护的;
4)具有一个纯虚函数,这个是最通常的情况。