Thinking in C++ (1-5)

来源:互联网 发布:乐高编程软件ios下载 编辑:程序博客网 时间:2024/06/07 01:15

 

创建和删除对象

从技术上讲,OOP的主要领域是抽象数据类型,继承,以及多态,但是其他领域一样很重要,在这一节中我们简单的介绍一下这些内容。

尤其重要的是对象创建和删除的方法。对象的数据是保存在哪里的,又是什么在控制着它们的生命周期呢?在这里,不同的编程语言的基本原理各不相同,C++更看重的是效能控制,所以它让程序员自己做出选择。为了得到最快的运行速度,程序员在编写程序时,可以通过选择是将对象置于栈中,还是置于静态存储空间中,从而对对象的存储地点和生存周期作出正确的决择。栈是一段内存,这段内存应该可以直接被微处理器在程序运行过程中作数据存储器使用。保存在栈内的变量在某些场合下称为“自动的(automatic)”或者“限域的(scoped)”变量。静态存储区域是在程序运行开始之前实现申请好的一段内存。使用栈还是使用静态存储区域,在存储空间的申请和释放的速度上存在一个优先级,这一优先级在很多情况下很有用。但是,你将以牺牲函数的简单性为代价,因为在编程时,你必须确切的知道对象的数量,生命周期,和类型等信息。如果你正在试图解决一个更加一般化的问题,比如说CAD,仓库管理系统,或者航空控制系统等等,这种做法无异于作茧自缚。

第二种手段是在“堆(heap)”上动态创建对象。使用堆时,在程序运行之前你无需清楚需要创建多少个对象,它们将会有多长的生存周期,也无需知道它们的确切的类型是什么。程序就在运行的时候做出这些决定。如果你需要一个新的对象,你只需按你的需要把它放置在堆上,这一功能通过new关键字来实现。当你用完了这一存储空间,你还必须使用delete关键字来释放它。

因为对存储空间管理工作是动态的存在于运行时的,很显然的在堆上申请内存的时间要远远大于使用栈。(在栈上申请空间通常就是一个简单的微处理器指令——向上或向下移动栈顶指针)这里有一个逻辑上的假设:使用动态的方法时创建的都是复杂的对象,所以说,寻找和释放存储空间所带来的额外开销并不会给创建对象带来多显著的影响。同时,这种更加便利的方法对于解决一般的编程问题是非常有效的。

对于对象的生命周期有另一个问题:如果你在栈上或静态存储空间上创建了一个对象,编译器将会决定对象可以存活多久并且自动的删除它。然而,如果你在堆上建立了一个对象的话,编译器便对于这一对象的生存周期一无所知。在C++中,程序员必须在程序中明确指出何时删除某一个对象,然后通过delete关键字对对象进行析构。这里有另一种方法,程序环境还可以提供一个称为“垃圾回收器”的特性,垃圾回收器能自动发现不再有用的对象,同时销毁它。当然使用一门包含垃圾回收器的语言来编程是很方便的,但是这需要所有的应用程序必须可以忍受垃圾回收器的存在,并且能够承受垃圾回收器的开销。由于这不符合C++语言的设计要求所以C++并不包含垃圾回收器。但是市面上有一些第三方厂家为C++开发的垃圾回收器。

错误的解决方法——异常处理

自从编程语言问世以来,错误处理机制一直是最难以解决的问题之一。因为设计一个优秀的错误处理机制太困难了,许多语言只是简单的忽略了这一机制,把这一问题留给了类库的设计人员,但是他们也只给出了一个不完善的方法,这些方法只是简单的忽略了这些错误,虽然能在大多数情况下正确的运行,但是很容易陷入困境。错误处理机制的核心问题是:它需要程序员自己时刻保持警惕性,这一需求并不是由语言强制实现的,而是约定俗成的。如果程序员并没有始终保持警惕性(通常是因为他们太忙了),这一机制很容易就会被遗忘。

“异常处理”机制将错误处理问题直接置于编程语言之中,有些时候甚至使操作系统之中。一个异常就是一个从出错点被“抛出”的对象,它可以被一个合适的设计专门用来解决某一特定类型的错误的“异常处理器”所“捕获”,异常处理机制使用的是与程序正常运行路径之间并行的(即可以各自运行,互不干扰)不同的路径,并在出现错误时候起作用。因为它使用了一条分离的运行路径,所以它不需要知道你的可正常运行的代码的接口。这使得代码编写工作更加方便,因为你不需要总是把时间浪费在检查错误上了。另外,一个抛出的异常并不像函数返回错误值和函数中的出错标记(flag)那样可以被忽略,异常不能被忽略,因此它一定会在什么地方得到解决。最后一点,异常提供了一条当前状况从出错修复到可靠状态的路径。现在你可以对出错状况进行校正,同时恢复程序的运行,而不是简单的退出程序。这一机制可以帮助你写出更加健壮的程序。

值得注意的是:异常处理机制并不是一个面向对象独有的特征,尽管在面向对象语言中异常通常就表示为一个对象。异常处理机制在面向对象语言出现之前就已经存在了。

在这本书中仅对异常处理作了简单的介绍,对它的应用也是最简单的。本书的第二卷(可以在www.BruceEckel.com订购到)中对异常处理进行了全面细致的讲解。