C++程序设计 第4章

上传人:nt****6 文档编号:45693778 上传时间:2018-06-18 格式:PDF 页数:32 大小:133.06KB
返回 下载 相关 举报
C++程序设计 第4章_第1页
第1页 / 共32页
C++程序设计 第4章_第2页
第2页 / 共32页
C++程序设计 第4章_第3页
第3页 / 共32页
C++程序设计 第4章_第4页
第4页 / 共32页
C++程序设计 第4章_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《C++程序设计 第4章》由会员分享,可在线阅读,更多相关《C++程序设计 第4章(32页珍藏版)》请在金锄头文库上搜索。

1、4.1 函数的重载函数的重载4.2 运算符重载运算符重载第第 4 章 重载章 重载返回主目录4.1 函 数 的 重 载函 数 的 重 载4.1.1 函数重载的定义函数重载的定义在第1章介绍C语言与C+之间的关系时,提到C+语言 中允许函数重载,即可以有多个同名但参数形式不完全相同 的函数。它允许程序员定义作用相同但参数形式不同的函 数,在调用时无须记忆多个函数名,而且可以增加程序的可 读性。例如,求两个数中最大值的函数max,不管其参数的 整数类型、实数类型、字符串,都可以使用同名函数来实 现,调用时只需使用max就可以了,编译器将根据实参的类 型判断应该调用哪一个函数。函数重载无须特别声明,

2、只要所定义的函数与已经定义 的同名函数形参形式不完全相同,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);因为第二个

3、函数缺省参数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; e

4、lse 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语言编译器在处

5、理函数时只需保留函数名的 信息,即可在连接时将不同的函数区别开来;而C+编译器 在编译时生成一个包含函数名和函数参数信息的符号来取代 原来的函数名,以保证在连接时能够找到正确的函数。但是,有时程序员可能希望编译器对某些函数使用C编译 的习惯来进行处理。例如,需要在C+程序中调用C语言编译 的函数库中的函数,此时可以采取如下的方法来编写包含该 函数库中的函数原型声明的头文件。extern “C“ /*在此处写上函数的原型声明*/编译器将以C语言的编译方式处理该函数的名字。如果要保证该头文件能够同时被C编译器和C+编译器正 确编译,可采用下面的方法:#ifdef _cplusplusextern

6、“C“ #endif/*在此处写上函数的原型声明*/#ifdef _cplusplus#endif4.2 运 算 符 重 载运 算 符 重 载4.2.1 运算符重载的基本方法运算符重载的基本方法C+语言中提供了运算符重载的机制,程序员可以对自 定义的数据类型使用C+语言本身提供的标准运算符进行运算,运算的方式由重载的特殊函数来完成。这些函数有特殊 的函数名,可使用运算符方式进行调用,当然也可以使用传 统的函数调用的方式进行调用。使用运算符重载可以提高程序的可读性。例如,前面讲 的整形数据元素集合类的例子中定义了一个函数Union来实现 集合的并集运算,如果使用+运算符来实现集合的并集运算, 如

7、用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类中重载了运算

8、符+、-,实际上定义了两个函数成员,它们的名字是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 运算符。对于重载的运算符可以使用运算符方式调用,也可以使用函数调用方式调用。通常对于双目运算符,重载

9、时一般声明为类的友元来提高程序的可读性。例如对上面的类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);从函数原型中可以直接看出,+、运算符为双目运算符,而重载为函数成员时,函数原型中似乎只有一个参数,

10、影响了程序的可理解性。当然有时某些运算符必须重载为友 元而不是成员,主要是因为表达式中运算符的顺序问题,因 为重载为函数成员时类对象本身作为第一个运算参数,例如 流输出运算符大于 *乘=大于等于 *=乘/赋值右移 +加=右移/赋值 +=加/赋值异或 -减=异或/赋值 -=减/赋值|按位或 -成员选取|=按位或/赋值 /除|逻辑或 /=除/赋值#include class counterunsigned int value;public:counter( )value=0;void operator+( );void operator ( );void Print( )coutclass cou

11、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

12、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维向量。这种表达式更接近数学中的表达方式,使得程序的可理解性更好。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号