Effective C++ 条款19 设计class犹如设计type
条款19 : 设计class犹如设计type
C++ 是面向对象编程语言, 当你定义了一个新class, 也就定义了一个新type. 然而设计一个优秀的class是一项艰巨的任务, 正如设计一个好的type是一项艰巨的任务. 本条款将依照一个好的类型应有的行为来指导我们class的设计, 并一一列举出来.
当我们要设计一个class
时, 让我们对自己提出这些问题吧 :
新type的对象应该如何创建和销毁?
想想
class
的构造和析构是否可以默认生成 不能的话该怎样编写.想想是否要是设计内存的分配函数和释放函数.
对象的初始化和对象的赋值该有什么样的差别?
想想在
class
构造时需要有什么特殊的步骤, 以及是否需要设置一个init
函数辅助构造.想想
copying
时的策略是怎样的. (见条款14)新type的对象如果被 pass-by-value(以值传参) , 意味着什么?
记住copy构造函数用来定义一个
type
被pass-by-value
应当产生的行为.什么是新type的”合法值”?
想想class的成员变量在你的预期中是否有一个合法的范围, 想想该怎样约束.
想想是否要设置超出合法范围时触发的检查机制.
新type需要配合某个继承图系吗?
如果其继承自某些既有的
class
, 你就应当受到那些class
设计的束缚, 好好分析那些virtual
函数是否要重写, 哪些不用.尤其看看析构函数是否为
virtual
. (见条款7)新type需要什么样的转换?
想想你的
class
可以和其他class
产生什么可能且合理的转换, 如果有可以考虑实施.如果有就写一个类型转换函数或接受其他类型的构造函数, 没有请声明
explicit
.什么样的操作符和函数对此新type而言是合理的?
这个属于你的设计私事, 但也必须考虑清楚.
什么样的默认成员函数应该驳回?
将需要驳回的成员函数设置为
private
或者直接delete
掉. (见条款6)谁该取用新type的成员?
想想哪些成员应设为
public
, 哪些应设为protected
, 哪些应设为private
.想想哪些
classes/functions
应是friends
.什么是新type的”未声明接口”?
想想你的
class
不对外的底层函数可以提供什么样的服务, 是否进行资源运用, 是否需要应对多线程情况, 以此在实现中加上相应的约束条件.新type有多么一般化?
想想你的
class
是否要接受泛型编程, 有没有使用泛型编程的必要.真的需要一个新type吗?
想想真的要定义一个新的class吗? 在你定义
derived class
时, 如果只是单纯地想添加一些机能, 而不是出于多态考虑, 那么说不定单纯定义一个或多个non-member
函数或templates
, 更能够达到目标. 就像是STL
源码中的priority_queue
, 为了使用堆机制其实并没再建立一个专属的堆类, 而是写了几个用于调整堆结构的函数, 再套在vector
上就实现了堆的功能.
请记住 :
class
的设计就是type
的设计, 在设计一个class
之前请确定思考过本条款所提出的所有问题.
by 天目中云