C++编程思想05.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:14 大小:483KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

C++编程思想05.pdf

C++编程思想05.pdf

预览

免费试读已结束,剩余 4 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

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