- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
下载
第4章 初始化与清除
第2章利用了一些分散的典型 C语言库的构件,并把它们封装在一个 s t r u c t 中,从而在库的
应用方面做了有意义的改进。(从现在起,这个抽象数据类型称为类)。
这样不仅为库构件提供了单一一致的入口指针,也用类名隐藏了类内部的函数名。在第 3
章中,我们介绍了存取控制(隐藏实现),这就为类的设计者提供了一种设立界线的途径,通
过界线的设立来决定哪些是用户可以处理的,哪些是禁止的。这意味着数据类型的内部机制
对设计者来说是可控的和能自行处理的。这样让用户也清楚哪些成员是他们能够使用并加以
注意的。
封装和实现的隐藏大大地改善了库的使用。它们提供的新的数据类型的概念在某些方面比
从C 中继承的嵌入式数据类型要好。现在 C + +编译器可以为这种新的数据类型提供类型检查,
这样在使用这种数据类型时就确保了一定的安全性。
当然,说到安全性,C + + 的编译器能比C编译器提供更多的功能。在本章及以后的章节中,
我们将看到许多C + + 的另外一些性能。它们可以让我们程序中的错误暴露无遗,有时甚至在我
们编译这个程序之前,帮我们查出错误,但通常是编译器的警告和出错信息。所以我们不久就
会习惯:在第一次编译时总听不到编译器那意味着正确的提示音。
安全性包括初始化和清除两个方面。在 C语言中,如果程序员忘记了初始化或清除一个变
量,就会导致一大段程序错误。这在一个库中尤其如此,特别是当用户不知如何对一个 s t r u c t
初始化,甚至不知道必须要初始化时。(库中通常不包含初始化函数,所以用户不得不手工初
始化s t r u c t )。清除是一个特殊问题,因为C程序员一旦用过了一个变量后就把它忘记了,所以
对一个库的s t r u c t来说,必要的清除工作往往被遗忘了。
在C + + 中,初始化和清除的概念是简化类库使用的关键所在,并可以减少那些由于用户忘
记这些操作而引起的许多细微错误。本章就来讨论 C + + 的这些特征。
4.1 用构造函数确保初始化
在s t a s h和s t a c k类中都曾调用 i n i t i a l i z e ( ) 函数,这暗示无论用什么方法使用这些类的对象,
在使用之前都应当调用这一函数。很不幸的是,这要求用户必须正确地初始化。而用户在专注
于用那令人惊奇的库来解决他们的问题的时候,往往忽视了这些细节。在 C + + 中,初始化实在
太重要了,所以不能留给用户来完成。类的设计者可以通过提供一个叫做构造函数的特殊函数
来保证每个对象都正确的初始化。如果一个类有构造函数,编译器在创建对象时就自动调用这
一函数,这一切在用户使用他们的对象之前就已经完成了。对用户来说,是否调用构造函数并
不是可选的,它是由编译器在对象定义时完成的。
接下来的问题是这个函数叫什么名字。这必须考虑两点,首先这个名字不能与类的其他成
员函数冲突,其次,因为该函数是由编译器调用的,所以编译器必须总能知道调用哪个函数。
S t r o u s t r u p的方法似乎是最容易也是最符合逻辑的:构造函数的名字与类的名字一样。这使得
这样的函数在初始化时自动被调用。
下面是一个带构造函数的类的简单例子:
56 C + +编程思想
下载
现在当一个对象被定义时:
这时就好像a是一个整数一样:为这个对象分配内存。但是当程序执行到 a 的定义点时,构
造函数自动被调用,因为编译器已悄悄地在 a 的定义点处插入了一个X : : X ( ) 的调用。就像其他
成员函数被调用一样。传递到构造函数的第一个参数(隐含)是调用这一函数对象的地址。
像其他函数一样,我们也可以通过构造函数传递参数,指定对象该如何创建,设定对象初
始值等等。构造函数的参数保证对象的所有部分都被初始化成合适的值。举例来说:如果类
t r e e有一个带整型参数的构造函数,用以指定树的高度,那么我们就必须这样来创建一个对象:
tree t(12); // 12英尺高的树
如果t r e e ( i n t )是唯一的构造函数,编译器将不会用其他方法来创建一个对象(在下一章我
们将看到多个构造函数以及调用它们的不同方法)。
关于构造函数,我们就全部介绍完了。构造函数是一个有着特殊名字,由编译器自动为每
个对象调用的函数,然而
文档评论(0)