网站大量收购闲置独家精品文档,联系QQ:2885784924

《C++程序设计教程》课件第3章.ppt

  1. 1、本文档共141页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

3.1函数重载

3.2内联函数

3.3引用

3.4友元

3.5名空间

本章要点

练习

3.1函数重载

3.1.1重载的概念

在C中,在同一个程序中声明两个同名函数是一种语法

错误。而在C++中只要函数命名了不同的参数集,就允许用

同一名字定义多个函数。C++的这种能力称为函数重载。下

面就用C++中提供的重载机制来实现本章开始时提出的求绝

对值问题。

【例3-1】演示通过重载求x的绝对值。

#includeiostream.h

voidFun(longx)

{if(x0)coutxendl;

elsecout-xendl;

}

voidFun(doublex)

{if(x0)coutxendl;

elsecout-xendl;

}

通过重载的方法只用了一个函数名Fun,分别实现了求

long、double和int类型数的绝对值。重载的优点包括:对于

不同的数据类型完成类似的操作;对于函数名的取名,可以

见名知义,消除了在同一操作中使用不同函数名称的情况;

有助于轻松理解和调试代码;使代码维护变得更加容易。

3.1.2匹配重载函数的顺序

匹配重载函数是由编译器完成的。编译器通过函数名和

其参数类型识别重载函数。编译器在识别时,通过参数个数、

参数类型和参数的次序确定被匹配的函数,并对每一个函数

的标识符进行特别编码,以便实现匹配的唯一性。这一过程

有教材称为“名字改编”或“名字修饰”。

在匹配重载函数时按优先级进行,具体步骤为:先寻找

是否有严格匹配(所谓严格匹配,就是同类型的匹配),然后

通过内部数据转换寻找是否有匹配。

对于两个内部数据,系统能自动寻找匹配。如若有long和

double形参,那么0、char和shortint等的实参,都是经内部数

据转换后可匹配的参数类型。

【例3-2】演示重载函数的内部转换匹配,通过用户定

义的转换寻找是否有匹配。

其中要注意,对于带有const修饰的内部转换,只适用

char*转换为constchar*;对于其他非指针类型的情况,就认

为是严格匹配。如在下面的代码中,由于存在两个严格匹配

函数而出错,去掉任何一个都可以。

3.1.3对重载函数的要求

1.重载函数具有不同参数

重载函数至少在参数类型、参数个数或者参数顺序上有

所不同。C++的函数如果在参数类型、参数个数、参数顺序

上有所不同,则认为是不同的匹配,可以进行重载。如果仅

仅只有函数的返回类型不同是不够的,重载将不能实现。

在C++中这样规定的理由就是要保证对重载的匹配只是

针对单独的运算符或函数调用,而与调用环境无关。下面是

不合要求的重载函数的例子。

2.函数重载要在同一作用域内

函数重载要在同一个作用域内才能实现。对于几个不同

作用域中的函数是无法实现重载的。

【例3-3】函数重载与作用域的关系。

#includeiostream.h

voidFun(intx)

{coutint:xendl;}

运行结果:

double:100

显然Fun(100)最好的匹配应当是Fun(intx),但是

Fun(doubley)在main函数的局部作用域里,所以就优先匹配

Fun(doublex)。若去掉函数声明,则两个函数在同一作用域

中,可实现重载,于是输出int:100。

3.不要让重载执行不同的功能

重载的目的是:有助于轻松理解和调试代码,使代码维

护变得更加容易,增加可读性。因此让重载执行不同的功能

不是好的编程风格。同名函数应该具有相同的功能。

3.1.4重载的实现

重载可以发生在非成员函数之间,也可以发生在同一类

的成员函数之间或构造函数之间。总之,只要函数在同一作

用域内,满足重载的要求就可以进行重载。

【例3-4】通过建一个表格类来演示在构造函数之间进

行重载。

#includeiostream.h

#includestring.h

classTable

{protected:

longnumber;

charname[20];

floatwages;

floatsubsidy;

intmonth;

intyear;

public:

Table(char*pName,longn)

{strcpy(name,pName);

number=n;wages=0;month=0;year=0;subsidy=0;

}

Table(char*pNa

文档评论(0)

酱酱 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档