条款 19:设计 class 犹如设计 type
Treat class design as type design.
应当带着“语言设计者当初设计语言内置类型时”一样的谨慎来研讨 class 的设计。
几乎每一个 class 都要求你面对以下提问:
新 type 的对象应该如何被创建和销毁?
这会影响 class 的构造函数和析构函数,以及内存分配函数和释放函数(new,new[],delete,delete[])
对象的初始化和对象的赋值该有什么样的差别?
新 type 的对象如果被 passed by value(以值传递),意味着什么?
什么是新 type 的“合法值”?
你的新 type 需要配合某个继承图系吗?
如果继承自既有 class,你就会收到这些 classes 设计的束缚,特别是收到它们的函数是 virtual 或 non-virtual 的影响。如果你允许其他 classes 继承你的 class,会影响你所申明的函数,尤其是析构函数是否为 virtual
什么样的操作符和函数对此新 type 而言是合理的?
什么样的标准函数应该驳回?
如果不需要编译器默认生成的版本,需要自行申明为 private 拒绝
谁该取用新 type 的成员?
这会影响你 class 所有成员的可访问级别,以及哪些是 friends
什么是新 type 的“未申明接口”?
你的新 type 有多么一般化?
或许你并非定义一个新 type,而是定义一整个 types 家族,此时应该定义一个新的 class template 而非 class
你真的需要一个新 type 么?
如果只是添加一些功能,也许淡出添加些 non-member 函数或 templates 就能达到目标