电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > PDF文档下载
分享到微信 分享到微博 分享到QQ空间

C++程序设计 第4章

  • 资源ID:45693778       资源大小:133.06KB        全文页数:32页
  • 资源格式: PDF        下载积分:12金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要12金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

C++程序设计 第4章

4.1 函数的重载函数的重载4.2 运算符重载运算符重载第第 4 章 重载章 重载返回主目录4.1 函 数 的 重 载函 数 的 重 载4.1.1 函数重载的定义函数重载的定义在第1章介绍C语言与C+之间的关系时,提到C+语言 中允许函数重载,即可以有多个同名但参数形式不完全相同 的函数。它允许程序员定义作用相同但参数形式不同的函 数,在调用时无须记忆多个函数名,而且可以增加程序的可 读性。例如,求两个数中最大值的函数max,不管其参数的 整数类型、实数类型、字符串,都可以使用同名函数来实 现,调用时只需使用max就可以了,编译器将根据实参的类 型判断应该调用哪一个函数。函数重载无须特别声明,只要所定义的函数与已经定义 的同名函数形参形式不完全相同,C+编译器就认为是函数 的重载。例如下面的两个函数:void GetTime(long *ticks);void GetTime(int *hours, int *minutes, int *seconds);作用相同,都是返回当前时间,只是其返回的时间表示形式不同,使用相同的函数名,但其参数形式不同。在使用函数重载时要注意,如果某个函数参数有缺省值,必须保证其参数缺省后调用形式不与其它函数混淆。例如下面的重载是错误的:int f(int a, float b);void f(int a, float b, int c=0);因为第二个函数缺省参数c后,其形式与第一个函数参数形式相同。下面的函数调用语句:f(10, 2.0);具有二义性,既可以调用第一个函数,也可以调用第二个函数,编译器不能根据参数的形式确定到底调用哪一个。类的函数成员同样也可以重载。例如前面介绍的构造函数,一个类可以具有多个不同参数形式的构造函数。类的函数成员的重载与全局函数的重载方法相同。4.1.2 一个简单的例子一个简单的例子下面实现前面提到的max函数的重载版本:int max(int a, int b)if(a>b)return a;elsereturn b;float max(float a, float b) if(a>b) return a; else return b; char * max(char *a, char *b) if(strcmp(a,b)>0) return a; else return b; 这里定义了三个名为max的函数,它们的函数原型不同,C+编译器在遇到程序中对max函数的调用时将根据参数形式进行匹配,如果找不到对应的参数形式的函数定义,将认为该函数没有函数原型,编译器会给出错误信息。4.1.3 在在C+中编译中编译C程序程序在使用C+语言进行程序开发时,由编译器将源程序文 件编译为目标文件,并进行连接。为了实现函数的重载, C+语言编译器在编译时对函数的处理与C语言编译器采取了 不同的方法。C语言编译器在处理函数时只需保留函数名的 信息,即可在连接时将不同的函数区别开来;而C+编译器 在编译时生成一个包含函数名和函数参数信息的符号来取代 原来的函数名,以保证在连接时能够找到正确的函数。但是,有时程序员可能希望编译器对某些函数使用C编译 的习惯来进行处理。例如,需要在C+程序中调用C语言编译 的函数库中的函数,此时可以采取如下的方法来编写包含该 函数库中的函数原型声明的头文件。extern “C“ /*在此处写上函数的原型声明*/编译器将以C语言的编译方式处理该函数的名字。如果要保证该头文件能够同时被C编译器和C+编译器正 确编译,可采用下面的方法:#ifdef _cplusplusextern “C“ #endif/*在此处写上函数的原型声明*/#ifdef _cplusplus#endif4.2 运 算 符 重 载运 算 符 重 载4.2.1 运算符重载的基本方法运算符重载的基本方法C+语言中提供了运算符重载的机制,程序员可以对自 定义的数据类型使用C+语言本身提供的标准运算符进行运算,运算的方式由重载的特殊函数来完成。这些函数有特殊 的函数名,可使用运算符方式进行调用,当然也可以使用传 统的函数调用的方式进行调用。使用运算符重载可以提高程序的可读性。例如,前面讲 的整形数据元素集合类的例子中定义了一个函数Union来实现 集合的并集运算,如果使用+运算符来实现集合的并集运算, 如用A+B表示两个集合A、B的并集运算,则程序会具有更好 的可读性。C+语言中常见的单目和双目运算符大部分都可以重载。 下面以一个简单类的运算的例子来介绍运算符重载的基本方法。先来看看如何在类的定义中声明一个重载的运算符:class Point int x, y; public: Point(int x, int y)Point:x=x;Point:y=y; Point operator +(Point p) return Point(x+p.x, y+p.y); Point operator (Point p) return Point(x-p.x, yp.y); ;在Point类中重载了运算符+、-,实际上定义了两个函数成员,它们的名字是operator +与operator 。定义了这两个函数成员之后,编译器在遇到下面的程序段时,将调用这两个函数成员。 Point p1(10, 0), p2(0, 10);Point p3=p1+p2;Point p4=p1p2;对这里的表达式p1+p2、p1p2,编译器将其解释为:p1.operator +(p2);p1.operator (p2);从这个例子中可以看出,在重载某个运算符时,实际上就是定义了一个函数,函数名为 operator 运算符。对于重载的运算符可以使用运算符方式调用,也可以使用函数调用方式调用。通常对于双目运算符,重载时一般声明为类的友元来提高程序的可读性。例如对上面的类Point,可以采用下面的方法来实现:class Pointint x, y;public:Point(int x,int y)Point:x=x;Point:y=y;friend Point operator +(Point p,Point q)return Point(p.x+q.x, p.y+q.y);fridend Point operator (Point p,Point q)return Point(p.xq.x,p.yq.y);从函数原型中可以直接看出,+、运算符为双目运算符,而重载为函数成员时,函数原型中似乎只有一个参数, 影响了程序的可理解性。当然有时某些运算符必须重载为友 元而不是成员,主要是因为表达式中运算符的顺序问题,因 为重载为函数成员时类对象本身作为第一个运算参数,例如 流输出运算符大于 *乘>=大于等于 *=乘/赋值>>右移 +加>>=右移/赋值 +=加/赋值异或 -减=异或/赋值 -=减/赋值|按位或 ->成员选取|=按位或/赋值 /除|逻辑或 /=除/赋值#include class counterunsigned int value;public:counter( )value=0;void operator+( );void operator ( );void Print( )coutclass counter unsigned int value; public: counter( )value=0; counter(int x)value=x; void operator+( ) value+; void operator ( )value ; friend counter operator +(counter c1,counter c2); operator int( )return value; void Print( )cout#include class Vectint xVal, yVal;public:Vect(int x, int y)xVal=x;yVal=y; int operator (char *); int operator( )(char *); ; int Vect:operator(char *s) if(strcmp(s, “x“)=0) return xVal; if(strcmp(s, “y“)=0) return yVal; return 0; int Vect:operator( )(char *s) if(strcmp(s, “x“)=0) return xVal; if(strcmp(s, “y“)=0) return yVal; return 0; void main( ) Vect v1(10, 20); cout<<v1“x“<<'n' cout<<v1(“y“)<<'n' 上面的程序定义了一个存储二维向量的类Vect,重载了下标运算符和函数调用运算符,在主函数中使用v1“x“和v1“y“来返回v1的x维向量和y维向量。这种表达式更接近数学中的表达方式,使得程序的可理解性更好。

注意事项

本文(C++程序设计 第4章)为本站会员(nt****6)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.