1.7 创建和销毁对象
从技术角度,OOP的论域就是抽象数据类型、继承和多态性。但是,其他一些问题也是重要的。本节对这些问题给出综述。
特别重要的是对象创建和销毁的方法。对象的数据存放在何处?如何控制对象的生命期?不同的程序设计语言有不同的行事之道。C++采取的方法是把效率控制作为最重要的问题,所以它为程序员提供了一个选择。为了最大化运行速度,通过将对象存放在栈中或静态存储区域中,存储和生命期可以在编写程序时确定。栈是内存中的一个区域,可以直接由微处理器在程序执行期间存放数据。在栈中的变量有时称为自动变量(automatic variable)或局部变量(scoped variable)。静态存储区域简单说是内存的一个固定块,在程序开始执行以前分配。使用栈或静态存储区,可以快速分配和释放,有时这是有价值的。然而,我们牺牲了灵活性,因为程序员必须在写程序时知道对象的准确数量、生命期和类型。如果程序员正在解决一个更一般的问题,例如计算机辅助设计、仓库管理或者空中交通控制,这就太受限制了。
第二种方法是在称为堆(heap)的区域动态创建对象。用这种方法,可以直到运行时还不知道需要多少个对象,它们的生命期是什么和它们的准确的数据类型是什么。这些决定是在程序运行之中作出的。如果需要新的对象,直接使用new关键字让它在堆上生成。当使用结束时,用关键字delete释放。
因为这种存储是在运行时动态管理的,所以在堆上分配存储所需要的时间比在栈上创建存储的时间长得多(在栈上创建存储常常只是一条向下移动栈指针的微处理器指令,另外一条是移回指令)。动态方法做出了一般性的逻辑假设,即对象趋向于更加复杂,所以,为找出存储和释放这个存储的额外开销对于对象的创建没有重要的影响。另外,对于解决一般性的程序设计问题,最大的灵活性是主要的。
另一个问题是对象的生命期。如果在栈上或在静态存储上创建一个对象,编译器决定这个对象持续多长时间并能自动销毁它。然而,如果在堆上创建它,编译器则不知道它的生命期。在C++中,程序员必须编程决定何时销毁此对象。然后使用delete关键字执行这个销毁任务。作为一个替换,运行环境可以提供一个称为垃圾收集器(garbage collector)的功能,当一个对象不再被使用时此功能可以自动发现并销毁这个对象。当然,使用垃圾收集器编写程序是非常方便的,但是它需要所有应用软件能忍受垃圾收集器的存在及垃圾收集的系统开销。这并不符合C++语言的设计需要,因此C++没有包括它,尽管存在用于C++的第三方垃圾收集器。