C++编程思想(中文PDF文字版)5.pdfVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++编程思想(中文PDF文字版)5.pdf

下载 第5章 函数重载与缺省参数 能使名字方便使用,是任何程序设计语言的一个重要特征。 当我们创建一个对象(即变量)时,要为这个存储区取一个名字。一个函数就是一个操作 的名字。正是靠系统描述各种各样的名字,我们才能写出易于人们理解和修改的程序。这在很 大程度上就像是写散文——目的是与读者交流。这里就产生了这样一个问题:如何把人类自然 语言的有细微差别的概念映射到编程语言中。通常,自然语言中同一个词可以代表许多种不同 的含义,这要依赖上下文来确定。这就是所谓的一词多义——该词被重载了。这点非常有用, 特别是对于细微的差别。我们可以说“洗衣服,洗汽车”。如果非得说成“洗(洗衣服的洗) 衣服,洗(洗汽车的洗)汽车”,那将是很愚蠢的,就好像听话的人对指定的动作毫无辨别能 力一样。大多数人类语言都是有冗余的,所以即使漏掉了几个词,我们仍然可以知道话的意思。 我们不需要单一的标识—而可以从上下文中理解它的含义。 然而大多数编程语言要求我们为每个函数设定一个唯一的标识符。如果我们想打印三种不 同类型的数据:整型、字符型和实型,我们通常不得不用三个不同的函数名,如 p r i n t _ i n t ( ) 、 p r i n t _ c h a r ( )和p r i n t _ f l o a t ( ) ,这些既增加了我们的编程工作量,也给读者理解程序增加了困难。 在C + + 中,还有另外一个原因需要对函数名重载:构造函数。因为构造函数的名字预先由 类的名字确定,所以只能有一个构造函数名。但如果我们想用几种方法来创建一个对象时该怎 么办呢?例如创建一个类,它可以用标准的方法初始化,也可以从文件中读取信息来初始化, 我们就需要两个构造函数,一个不带参数(缺省构造函数),另一个带一个字符串作为参数, 以表示用于初始化对象的文件的名字。所以函数重载的本质就是允许函数同名。在这种情况下, 构造函数是以不同的参数类型被调用的。 重载不仅对构造函数来说是必须的,对其他函数也提供了很大的方便,包括非成员函数。 另外,函数重载意味着,我们有两个库,它们都有一个同名的函数,只要它们的参数不同就不 会发生冲突。我们将在这一章中详细讨论这些问题。 这一章的主题就是方便地使用函数名。函数重载允许多个函数同名,但还有另一种方法使 函数调用更方便。如果我们想以不同的方法调用同一函数,该怎么办呢?当函数有一个长长的 参数列表,而大多数参数每次调用都一样时,书写这样的函数调用会使人厌烦,程序可读性也 差。C + + 中有一个很通用的作法叫缺省参数。缺省参数就是在用户调用一个函数时没有指定参 数值而由编译器插入参数值的参数。这样 f ( “h e l l o ”) , f ( “h i ”, 1 )和f ( “h o w d y ”, 2 , ‘c ’)可以 用来调用同一函数。它们也可能是调用三个已重载的函数,但当参数列表相同时,我们通常希 望调用同一函数来完成相同的操作。 函数重载和缺省参数实际上并不复杂。当我们学习完本章的时候,我们就会明白什么时候 用到它们,以及编译、连接时它们是怎样实现的。 5.1 范围分解 在第2章中我们介绍了名字范围分解的概念(有时我们用“修饰”这个更通用的术语)。在 下面的代码中: 70 C + +编程思想 下载 void f(); class x {void f();}; 类x 内的函数f ()不会与全局的f ()发生冲突,编译器用不同的内部名f ()(全局)和x : : f ( ) (成员函数)来区分两个函数。在第2章中,我们建议在函数名前加类名的方法来命名函数,所 以编译器使用的内部名字可能就是_ f和_ x _ f 。函数名不仅与类名关系密切,而且还跟其他因素 有关。 为什么要这样呢?假设我们重载了两个函数名: void print(char); void print(float); 无论这两个函数是某个类的成员函数还是全局函数都无关紧要。如果编译器只使用函数名字的 范围,编译器并不能产生单一的内部标识符,这两种情况下都得用 _ p r i n t 结尾。重载函数虽然 可以让我们有同名的函数,但这些函数的参数列表应该不一样。所以,为了让重载函数正确工 作,编译器要用函数名来区分参数类型

文档评论(0)

zhoujiahao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档