资源预览内容
第1页 / 共75页
第2页 / 共75页
第3页 / 共75页
第4页 / 共75页
第5页 / 共75页
第6页 / 共75页
第7页 / 共75页
第8页 / 共75页
第9页 / 共75页
第10页 / 共75页
亲,该文档总共75页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第10章 运算符重载10.1 什么是运算符重载 10.2 运算符重载的方法 10.3 重载运算符的规则 10.4 运算符重载函数作为类成员函数和友元函数 10.5 重载双目运算符 10.6 重载单目运算符 10.7 重载流插入运算符和流提取运算符 10.8 不同类型数据间的转换 10.1 什么是运算符重载lC+中预定义的运算符的操作对象只能是基本 数据类型。但实际上,对于许多用户自定义 的类型,也需要类似的运算。这时就必须重 新定义这些运算符,赋于已有运算符新的功 能,使之能够用于特定类型执行特定操作。l实际上,很多C+操作符已经被重载。例如, 将*操作符用于地址,将得到在这个地址中的 值;但将它用于两个数字时,得到的将是它 们的乘积。lC+根据操作数的数目和类型来决定采用哪种 操作。l使同一个运算符作用于不同类型的数据时导 致不同的行为的这种机制称为运算符重载运算符重载。lC+通过重载运算符使之用于自定义类型自定义类型,扩 展了运算符的功能,这也是C+最具吸引力的 优点之一。运算符重载机制l运算符重载是通过重载一种特殊函数运算符函数 来实现的。 l对C+运算符可作如下理解:l编译器在对运算符进行编译处理时,将一个运算符 编译成如下形式: l一元运算符:obj operator(obj)l二元运算符:obj1obj2 operator(obj1,obj2)l由于C+中有前增(减)、后增(减),为了区分 它们,C+将后增(减)编译成:l后增:obj+ operator+(obj,0)l后减:obj- operator-(obj,0)l依照上述规则,8+9、10.5+3.5分别编译成运 算符函数调用形式为:loperator+(8,9);loperator+(10.5,3.5);lC+为+运算符提供了多种运算符函数,其原 型有:loperator+(int,int);loperator+(double,double);l等10.2 运算符重载的方法l运算符重载的方法是定义一个重载运算符的 函数,在需要执行被重载的运算符时,系统 就自动调用该函数,以实现相应的运算。也 就是说,运算符重载是通过定义函数实现的 。l l运算符重载实质上是函数的重载。运算符重载实质上是函数的重载。l重载运算符的函数一般格式如下: l函数类型 operator 运算符名称 (形参表列)l l 对运算符的重载处理 l#include using namespace std; class Complex double real;double imag; public:Complex( )real=0;imag=0;Complex(double r,double i):real(r),imag(i) friend friend Complex operator+(Complex void display( ); ;Complex operator+(Complex c.real=c1.real+c2.real;c.imag=c1.imag+c2.imag;return c; void Complex:display( ) cout、=运算符,运算符重 载函数必须为类的成员函数。为什么?为什么?10.5 重载双目运算符l双目运算符(或称二元运算符)是C+中最常用 的运算符。双目运算符有两个操作数,通常 在运算符的左右两侧,如3+5,a=b,i”,用于两 个字符串的等于、小于和大于的比较运算。l下面分几步来介绍编程过程。 先建立一个String类l#include lusing namespace std;lclass Stringllpublic:l String( )l l p=NULL; /默认构造函数l l String(char *str); /构造函数l void display( );lprivate:l char *p; /字符型指针,用于指向字符串l;lString:String(char *str) /定义构造函数ll p=str; /使p指向实参字符串llvoid String:display( ) /输出p所指向的字符串ll cout”。l#include l#include lusing namespace std;lclass String l lpublic: l String( ) l l p=NULL; /默认构造函数 l l String(char *str); /构造函数 l void display( ); l friend bool operator(String lprivate: l char *p; /字符型指针,用于指向字符串 l;lString:String(char *str) /定义构造函数ll p=str; /使p指向实参字符串llvoid String:display( ) /输出p所指向的字符串ll cout(String l else return false;llint main( )ll String string1(“Hello“),string2(“Book“);l coutstring2) lusing namespace std; lclass Timellpublic: l Time( ) l l minute=0; /默认构造函数 l sec=0; l l Time(int m,int s):minute(m),sec(s) /构造函数重载 l Time operator+( ); /声明运算符重载函数 l void display( ) l l cout=60)l l sec-=60; /满60秒进1分钟l +minute;l l return *this; /返回当前对象值llint main( )ll Time time1(34,0);l for (int i=0; i=60)l l sec-=60;l +minute;l l return *this;llTime Time:operator+(int)ll Time temp(*this);l sec+;l if(sec=60)l l sec-=60;l +minute;l l return temp; /返回的是自加前的对象l可以看到:可以看到: 重载后置自增运算符时,多了一个重载后置自增运算符时,多了一个intint型的参数型的参数 ,增加这个参数只是为了与前置自增运算符重载函数有所,增加这个参数只是为了与前置自增运算符重载函数有所 区别,此外没有任何作用。编译系统在遇到重载后置自增区别,此外没有任何作用。编译系统在遇到重载后置自增 运算符时,会自动调用此函数。运算符时,会自动调用此函数。lint main( )ll Time time1(34,59),time2;l cout”是 C+在类库中提供的,所有C+编译系统都在类库 中提供输入流类istream和输出流类ostream。lcin和cout分别是istream类和ostream类的对象。 在类库提供的头文件中已经对“”进行了重 载,使之作为流插入运算符和流提取运算符,能用 来输出和输入C+标准类型的数据。因此,凡是用 “cout”对标准类型数据进行输入输出 的,都要用#include 把头文件包含到本 程序文件中。l用户自己定义类型的数据,是不能直接用“”来输出和输入的。如果想用它们输出和输入自 己声明的类型的数据,必须对它们重载。 l对“”重载的函数形式如下: listreamlostream”表示从输入流 中提取一个整数赋给变量i(假设已定义i为int 型)。重载流提取运算符的目的是希望将“” 用于输入自定义类型的对象的信息。lclass Complex l lpublic:l Complex( )l l real=0; l imag=0; l l Complex(double r,double i) l l real=r; l imag=i; l l Complex operator + (Complex l friend ostream lprivate: l double real; l double imag; l;lComplex Complex:operator + (Complex llostreamcoutc.imag;return input; lint main( )ll Complex c1,c2;l cinc1c2;l cout“c1=“c1endl;l cout“c2=“c2endl;l return 0;l10.8 不同类型数据间的转换 10.8.1 标准类型数据间的转换l在C+中,某些不同类型数据之间可以自动转换, 例如lint i = 6;li = 7.5 + i;l编译系统对 7.5是作为double型数处理的,在求解 表达式时,先将6转换成double型,然后与7.5相加 ,得到和为13.5,在向整型变量i赋值时,将13.5转 换为整数13,然后赋给i。这种转换是由C+编译系 统自动完成的,用户不需干预。这种转换称为隐式 类型转换。lC+还提供显式类型转换,程序人员在程序中指定 将一种指定的数据转换成另一指定的类型,其形式 为 l类型名(数据) l如 lint(89.5) l其作用是将89.5转换为整型数89。l对于用户自己声明的类型,编译系统并不知道怎样 进行转换。解决这个问题的关键是让编译系统知道 怎样去进行这些转换,需要定义专门的函数来处理 。10.8.2 转换构造函数l l转换构造函数转换构造函数的作用是将一个其他类型的数据转换成一个类 的对象。l先回顾一下以前学习过的几种构造函数: l默认构造函数。以Complex类为例,函数原型的形式为Complex( ); /没有参数l用于初始化的构造函数。函数原型的形式为Complex(double r,double i); /形参表列中一般有两个 以上参数l用于复制对象的复制构造函数。函数原型的形式为Complex (Complex /形参是本类对象的引用l现在又要介绍一种新的构造函数转换构 造函数。l转换构造函数只有一个形参,如 lComplex(double r) real=r;imag=0;l其作用是将double型的参数r转换成Complex 类的对象,将r作为复数的实部,虚部为0。 用户可以根据需要定义转换构造函数,在函 数体中告诉编译系统怎样去进行转换。l在类体中,可以有转换构造函数,也可以没 有转换构造函数,视需要而定。以上几种构 造函数可以同时出现在同一个类中,它们是 构造函数的重载。编译系统会根据建立对象 时给出的实参的个数与类型选择形参与之匹
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号