条款 19:设计 class 犹如设计 type

Treat class design as type design.

应当带着“语言设计者当初设计语言内置类型时”一样的谨慎来研讨 class 的设计。
几乎每一个 class 都要求你面对以下提问:

新 type 的对象应该如何被创建和销毁?

这会影响 class 的构造函数和析构函数,以及内存分配函数和释放函数(new,new[],delete,delete[])

对象的初始化和对象的赋值该有什么样的差别?

这会影响你的构造函数和赋值操作符的行为

新 type 的对象如果被 passed by value(以值传递),意味着什么?

这会影响 copy 构造函数

什么是新 type 的“合法值”?

所有成员函数需要进行错误检查工作,进行必要的约束,处理异常

你的新 type 需要配合某个继承图系吗?

如果继承自既有 class,你就会收到这些 classes 设计的束缚,特别是收到它们的函数是 virtual 或 non-virtual 的影响。如果你允许其他 classes 继承你的 class,会影响你所申明的函数,尤其是析构函数是否为 virtual

什么样的操作符和函数对此新 type 而言是合理的?

这会影响你为你的 class 申明哪些函数

什么样的标准函数应该驳回?

如果不需要编译器默认生成的版本,需要自行申明为 private 拒绝

谁该取用新 type 的成员?

这会影响你 class 所有成员的可访问级别,以及哪些是 friends

什么是新 type 的“未申明接口”?

它对效率、异常安全性以及资源运用提供何种保证?

你的新 type 有多么一般化?

或许你并非定义一个新 type,而是定义一整个 types 家族,此时应该定义一个新的 class template 而非 class

你真的需要一个新 type 么?

如果只是添加一些功能,也许淡出添加些 non-member 函数或 templates 就能达到目标