设计时要把抽象与实现分离。理由很简单,一是简化了类的抽象,忽略对当前设计目的来说不重要的属性或特性,如飞机驾驶培训系统的飞机类,就可以忽略飞机的客舱内部布置;二是把抽象与实现分现,将使抽象的实现更灵活。如飞机的起降控制,只需提供两个接口,具体起飞控制流程和降落控制流程并不需要涉及。又如,酒店预订系统的房间类,可以不考虑房间的装修时间,室内陈设的新旧程度,提供退房接口,也不关心退房的具体流程。
2.接口要最小化.通常,一个完美的类应该包含下面这些成员1~6。但是这不是所有类必须的,如果不需要,或者根本就是累赘,最好不要提供,下面一一举例说明。
1) 缺省构造函数 :
class Pool{
public: Pool(size_t n); //内调alloc,实现对象内存分配
void* alloc();
void free(void* p);}
如果提供了默认构造,则无法确定所分配对象的默认大小。
2) 拷贝构造函数
如C++语法解析器类Parser,由于具有大量内部数据结构,因此要想正确的拷贝它,将是非常不易的,也是不值得的。
3)相等运算符
如一个程序运行过程中,该类只有一个实例,显然,该类的相等运算符就有些多余。
4) 基本的赋值运算符
class Pool {
public :
Pool& operator=( const Pool& q);
};
我觉得原文作者关于这一点有些不对,实际上他列举的例子问题根结在于赋值前没有删除原有指针内存。
5) 析构函数
有些时候,不允许调用析构。这时候,我们就可以声明私有的析构(只能在堆上创建,又不能调delete删除)。
3. 注意深拷贝与浅拷贝,有些时候的影响将是灾难性的。
5.接口一致性
6.转型
某些隐式转型是不受欢迎的。要加以约束。或使用explicit
7.最大限度使用const关键字来约束接口