1、数据抽象
1) 首先, 为类型取一个描述性的名字。如果很难为这个类型命名,那就说明我们还不知道要实现什么。因此,我们需要多开动脑筋,结合业务逻辑,给即将产生的类一个好的合适的职责。这就是设计过程。一个抽象数据类型应该表示一个单一的、明确的概念,而且为该概念所取的名字应该是显而易见的。
2) 其次,列出类型所能执行的操作。要避免在实现时简单的为数据成员提供一连串的get/set(获取/设置)操作——那不是数据抽象,而是懒惰且缺乏想象力的表现。
3) 然后,为类型设计接口。
4) 最后,实现接口。
2、关于STL
1) STL包含三大组件:容器,算法和迭代器。
2) STL并不仅仅是一个库,它更是一种优秀的思想和一套约定。
3) STL不但使我们能够更轻松、更快捷地编写复杂的代码,而且使编写的代码级标准又高度优化。
4) STL的另一个优雅之处在于它的高度可配置。
5) 学习STL并广泛地使用STL吧!
3、赋值和初始化并不相同。
直接了当的说,赋值发生于赋值时,除此之外,遇到所有其它的复制情形均属于初始化,包括声明、函数返回、参数传递等。
4、当一个函数的名字作为参数传递时,函数名字会退化成一个指针。当函数作为函数指针进行传递时,它不能被内联(即使被inline声明了)。
5、Template Method(模板方法)模式
1)Template Method模式与C++中的模板一点关系都没有。
2) Template Method模式赋予基类设计者一种中级控制机制,该控制机制介于非虚函数提供的“(要么)占用它或离开它”和虚函数提供的“如果你不喜欢她就替换掉所有或部分东西”这两种机制之间。
3) Template Method模式也是一个“好莱坞法则”的例子,即“不要call我们,我们会call你”。
6、名字空间(namespace)
1) 本质上,名字空间是对全局作用域的细分。
2) “将using声明放进全局作用域中”是一个很馊很馊的主意!
3) 千万不要在头文件中使用using声明!尽量将using声明放在函数作用域内。最次之也应该放在源文件的#include之后。
7、指针比较的含义
http://blog.csdn.net/chenyu964877814/article/details/7078591
8、Prototype模式与Factory Method模式
1) 虚构造函数:在C++中,提供了克隆自身对象能力的成员函数,从传统上说,被称为“虚构造函数”。
2)Prototype(原型)模式其实可以看做Factory Method(工厂方法)模式的一个特例。其中,clone()函数就是一个工厂方法。
3) 使用Factory Method模式通常意味着一个高级设计需要基于一个对象的确切类型产生(创建)另一个“适当类型”的对象,这样的需要往往发生于存在多个平行或几乎平行的类层次结构中。
4)Factory Method 模式通常是治疗一系列运行期类型检查问题的良方。
9、协变返回类型(covariant return type)
1) 如果B是一个基类类型,D公有派生自B。那么,假设有一个基类虚函数返回B*, 那么一个重写的该虚函数可以返回D*。
如果基类虚函数返回B&,那么一个重写的该虚函数可以返回D&。
2)协变返回类型可以有效的避免类型信息丢失。从而使我们总是可以在一个适当的抽象层面工作。
10、拒绝编译器的遗赠:
1)禁止复制
2)禁止或强制使用堆分配
以上都是通过C++的public, protected, private访问属性来搞定的。
11、RAII和智能指针
1)RAII(资源获取即初始化)是一项很简单的技术。它利用C++对象生命周期的概念来控制程序的资源。
2)RAII主要用于希望对某个重要资源进行跟踪,即创建一个对象,并将资源的生命期和对象的生命期相关联。
3)RAII技术在C++编程中的影响是如此深远,以至于很难发现有哪个库或组件或大型代码块未使用某种方式使用它们。
4)RAII经常使用智能指针来实现。
12、指针算术运算
1)指针算术总是依照所指对象的大小比例来进行的,指针递增1,指针所代表的对象地址递增sizeof(T).
2) void* 不支持指针算术运算。原因正是因为我们不知道某个 void* 指针所指对象的类型,所以无法正确的按比例运算。
3)同一类型的两个指针可以进行减法运算(注意:加法可不行!),运算结果是参与运算的两个指针之间的元素个数。