在 C++ 中,就像其它面向对象编程语言,可以通过定义一个新的类来定义一个新的类型。作为一个 C++ 开发者,你的大量时间就这样花费在增大你的类型系统。这意味着你不仅仅是一个类的设计者,而且是一个类型的设计者。重载函数和运算符,控制内存分配和回收,定义对象的初始化和终结过程——这些全在你的掌控之中。因此你应该在类设计中倾注大量心血,接近语言设计者在语言内建类型的设计中所倾注的大量心血。
设计良好的类是有挑战性的,因为设计良好的类型是有挑战性的。良好的类型拥有简单自然的语法,符合直觉的语义,以及一个或更多高效的实现。在 C++ 中,一个缺乏计划的类设计,使其不可能达到上述任何一个目标。甚至一个类的成员函数的执行特性可能受到它们是被如何声明的影响。
那么,如何才能设计高效的类呢?首先,你必须理解你所面对的问题。实际上每一个类都需要你面对下面这些问题,其答案通常就导向你的设计的限制因素:
你的新类型的对象应该如何创建和销毁?如何做这些将影响到你的类的构造函数和析构函数,以及内存分配和回收的函数(operator new,operator new[],operator delete,和 operator delete[])的设计,除非你不写它们。
对象的初始化和对象的赋值应该有什么不同?这个问题的答案决定了你的构造函数和你的赋值运算符的行为和它们之间的不同。这对于不混淆初始化和赋值是很重要的,因为它们相当于不同的函数调用。
以值传递(passed by value)对于你的新类型的对象意味着什么?记住,拷贝构造函数定义了一个新类型的传值(pass-by-value)如何实现。
你的新类型的合法值的限定条件是什么?通常,对于一个类的数据成员来说,仅有某些值的组合是合法的。那些组合决定了你的类必须维持的不变量。这些不变量决定了你必须在成员函数内部进行错误检查,特别是你的构造函数,赋值运算符,以及 "setter" 函数。它可能也会影响你的函数抛出的异常,以及你的函数的异常规范(exception specification)(你用到它的可能性很小)。