Item 19:把类的设计视作类型设计
类设计时的思考
实际上每一个类都需要你面对下面这些问题:
- 新的类型的对象应该如何创建和销毁?
- 影响构造函数,析构函数的设计。
- 影响内存分配和回收函数(operator new,operator new[],operator delete,operator delete[])的设计。
- 对象的初始化和对象的赋值应该有什么不同?
- 构造函数和赋值运算符的行为如何。
- 避免混淆初始化和赋值。
- 以值传递对于你的新类型的对象意味着什么?
- 拷贝构造函数定义了一个新类型的传值(pass-by-value)如何实现。
- 新类型的合法值的限定条件是什么?
- 新类型是否适合放进一个继承图表中?
- 注意基类函数的影响。
- 析构函数是否为虚函数。
- 新类型允许哪种类型转换?
- 如果希望允许 T1 类型的对象隐式转型为 T2 类型的对象:
- 在 T1 类中写一个类型转换函数(例如,operator T2),能够以单一参数调用。
- 在 T2 类中写一个非显式的构造函数,能够以单一参数调用。
- 如果希望仅仅允许显示转换:
- 要写执行这个转换的函数,而且你还需要避免使它们的类型转换运算符或非显式构造函数能够以一个参数调用。
- 如果希望允许 T1 类型的对象隐式转型为 T2 类型的对象:
- 对于新类型哪些运算符和函数有意义?
- 新类型中哪些成员可以被访问?
- 哪些成员是 public,哪些是 protected,以及哪些是 private。
- 哪些类和函数应该是友元。
- 一个类嵌套在另一个类内部是否有意义。
- 新类型有多大程度的通用性?
- 是需要定义一个新的类模板。
- 新的类型真的是你所需要的吗?
- 否你可以仅仅定义一个新的继承类,以便让你可以为一个已存在的类增加一些功能。
- 通过简单地定义一个或更多非成员函数或模板能更好地达成你的目标。
总结
- 类设计就是类型设计。定义一个新类型之前,确保考虑了本 Item 讨论的所有问题。