电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

C++程序设计 第4章

32页
  • 卖家[上传人]:nt****6
  • 文档编号:45693778
  • 上传时间:2018-06-18
  • 文档格式:PDF
  • 文档大小:133.06KB
  • / 32 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、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);作用相同,都是返回当前时间,只是其返回的时间表示形式不同,使用相同的函数名,但其参数形式不同。在使用函数重载时要注意,如果某个函数参

      2、数有缺省值,必须保证其参数缺省后调用形式不与其它函数混淆。例如下面的重载是错误的: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(ab)return a;elsereturn b;float max(float a, float b) if(ab) return a; else return b; char * max(char *a, char *b) if(strcmp(a,b)0) return a; else return b; 这里定义了三个名为max的函数

      3、,它们的函数原型不同,C+编译器在遇到程序中对max函数的调用时将根据参数形式进行匹配,如果找不到对应的参数形式的函数定义,将认为该函数没有函数原型,编译器会给出错误信息。4.1.3 在在C+中编译中编译C程序程序在使用C+语言进行程序开发时,由编译器将源程序文 件编译为目标文件,并进行连接。为了实现函数的重载, C+语言编译器在编译时对函数的处理与C语言编译器采取了 不同的方法。C语言编译器在处理函数时只需保留函数名的 信息,即可在连接时将不同的函数区别开来;而C+编译器 在编译时生成一个包含函数名和函数参数信息的符号来取代 原来的函数名,以保证在连接时能够找到正确的函数。但是,有时程序员可能希望编译器对某些函数使用C编译 的习惯来进行处理。例如,需要在C+程序中调用C语言编译 的函数库中的函数,此时可以采取如下的方法来编写包含该 函数库中的函数原型声明的头文件。extern “C“ /*在此处写上函数的原型声明*/编译器将以C语言的编译方式处理该函数的名字。如果要保证该头文件能够同时被C编译器和C+编译器正 确编译,可采用下面的方法:#ifdef _cplusplusextern

      4、“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 +(Poi

      5、nt 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

      6、;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 cou

      7、nter 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); coutv1“x“n; coutv1(“y“)n; 上面的程序定义了一个存储二维向量的类Vect,重载了下标运算符和函数调用运算符,在主函数中使用v1“x“和v1“y“来返回v1的x维向量和y维向量。这种表达式更接近数学中的表达方式,使得程序的可理解性更好。

      《C++程序设计 第4章》由会员nt****6分享,可在线阅读,更多相关《C++程序设计 第4章》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2 2022年小学体育教师学期工作总结 2022年家长会心得体会集合15篇
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.