《运算符重载 》PPT课件.ppt





《《运算符重载 》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《运算符重载 》PPT课件.ppt(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学第第1010章章 运算符重载运算符重载10.1 10.1 什么是运算符重载什么是运算符重载10.2 10.2 运算符重载的方法运算符重载的方法10.3 10.3 重载运算符的规则重载运算符的规则10.4 10.4 运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数10.5 10.5 重载双目运算符重载双目运算符10.6 10.6 重载单目运算符重载单目运算符10.7 10.7 重载流插入运算符和流提取运算符重载流插
2、入运算符和流提取运算符10.8 10.8 不同类型数据间的转换不同类型数据间的转换电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学函数重载就是对一个已有的函数赋予新的含义,函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。使之实现新功能。用户能根据自己的需要对用户能根据自己的需要对C+C+已提供的运算符进行已提供的运算符进行重载重载,赋予它们新的含义,使之,赋予它们新的含义,使之一名多用一名多用。例如例如10.1 10.1:用:用“+”+”号进行两个复数的相加。在号进行两个复数的
3、相加。在C+C+中不能在程序中直接用运算符中不能在程序中直接用运算符“+”+”对复数进行对复数进行相加运算。用户必须自己设法实现复数相加。相加运算。用户必须自己设法实现复数相加。10.1 10.1 什么是运算符重载什么是运算符重载电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例10.1 通过函数来实现复数相加。通过函数来实现复数相加。#include using namespace std;class Complex /定义定义Complex类类public:Complex()rea
4、l=0;imag=0;/定义构造函数定义构造函数Complex(double r,double i)real=r;imag=i;/构造函数重构造函数重载载Complex complex_add(Complex&c2);/声明复数相加函声明复数相加函数数void display();/声明输出函数声明输出函数 private:double real;/实部实部double imag;/虚部虚部;Complex Complex complex_add(Complex&c2)Complex c;c.real=real+c2.real;电子与信息工程系电子与信息工程系COMPUTER SCIENCE&
5、TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学c.imag=imag+c2.imag;return c;void Complex display()/定义输出函数定义输出函数cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;/定义定义3个复数对个复数对象象c3=plex_add(c2);/调用复数相加函调用复数相加函数数coutc1=;c1.display();/输出输出c1的值的值coutc2=;c2.display();/输出输出c2的值的值coutc1+c2=;c3.disp
6、lay();/输出输出c3的值的值return 0;运行结果如下:运行结果如下:c1=(3,4i)c2=(5,-10i)c1+c2=(8,-6i)能否直接用加号能否直接用加号“+”来实来实现复数运算呢?如现复数运算呢?如:c3=c1+c2;电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学运算符重载的方法是定义一个重载运算符的函数,运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。重载
7、运算符的函数一般函数,以实现相应的运算。重载运算符的函数一般格式如下:格式如下:函数类型函数类型 operator operator 运算符名称运算符名称(形参表列形参表列)对运算符的重载处理对运算符的重载处理 例如,想将例如,想将“+”“+”用于用于ComplexComplex类类(复数复数)的加法运算,的加法运算,函数的原型可以是这样的:函数的原型可以是这样的:Complex operator+(Complex&c1,Complex&c2);Complex operator+(Complex&c1,Complex&c2);10.2 10.2 运算符重载的方法运算符重载的方法电子与信息工程系
8、电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学在定义了重载运算符的函数后,可以说:在定义了重载运算符的函数后,可以说:函数函数operator+operator+重载了运算符重载了运算符+。为了说明在运算符重载。为了说明在运算符重载后,执行表达式就是调用函数的过程,可以把两个后,执行表达式就是调用函数的过程,可以把两个整数相加也想像为调用下面的函数:整数相加也想像为调用下面的函数:int operator+(int a,int b)return(a+b);如果有表达式如果有表达式5+85+8,就调用此
9、函数,将,就调用此函数,将5 5和和8 8作为调作为调用函数时的实参,函数的返回值为用函数时的实参,函数的返回值为1313。这就是用函。这就是用函数的方法理解运算符。数的方法理解运算符。电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例10.2 改写例改写例10.1,重载运算符,重载运算符“+”,使之能用于两个复数,使之能用于两个复数相加。相加。#include using namespace std;class Complexpublic:Complex()real=0;imag=0
10、;Complex(double r,double i)real=r;imag=i;Complex operator+(Complex&c2);/声明重载运算符的函声明重载运算符的函数数void display();private:double real;double imag;Complex Complex operator+(Complex&c2)/定义重载运定义重载运算符的函数算符的函数 Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;operator+取代了取代了 complex_add隐含隐含this指针指针电子与信息工程系电子与信息
11、工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学return c;void Complex display()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;/运算符运算符+用于复数运算用于复数运算coutc1=;c1.display();coutc2=;c2.display();coutreal+c2.realthis-real+c2.real,this-this-realreal就是就是c1.realc1.real。10
12、.4 10.4 运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例10.3 将运算符将运算符“+”重载为适用于复数加法,重载为适用于复数加法,重载函数重载函数不作不作为成员函数,而放在类外,为成员函数,而放在类外,作为作为Complex类的类的友元函数友元函数。#include using namespace std;class Complexpublic:Complex()real=0;imag=0;Comp
13、lex(double r,double i)real=r;imag=i;friend Complex operator+(Complex&c1,Complex&c2);/重载函数作为友元函数重载函数作为友元函数void display();private:double real;double imag;电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学Complex operator+(Complex&c1,Complex&c2)/定义友定义友元函数的重载函数在类外访问私有成员元函数的重载
14、函数在类外访问私有成员return Complex(c1.real+c2.real,c1.imag+c2.imag);void Complex display()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();operator+(c1,c2)电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网
15、网 络络 教教 学学何种情况下选择运何种情况下选择运算符重载函数为类的成员函数、类算符重载函数为类的成员函数、类的友元函数和普通函数:的友元函数和普通函数:普通函数不能直接访问类的私有成员,极少选用。普通函数不能直接访问类的私有成员,极少选用。如果将运算符重载函数作为如果将运算符重载函数作为成员函数成员函数,它可以通过,它可以通过thisthis指针自由地访问本类的数据成员,可以少写一个指针自由地访问本类的数据成员,可以少写一个函数的参数。但必须要求运算表达式第一个参数函数的参数。但必须要求运算表达式第一个参数(即运即运算符左侧的操作数算符左侧的操作数)是一个是一个类对象。类对象。左侧的操作数
16、是标准类型左侧的操作数是标准类型就要使用就要使用友元函数友元函数(访问私访问私有成员有成员)电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例如:将一个复数和一个整数相加,如例如:将一个复数和一个整数相加,如c1+ic1+i,可以将,可以将运算符重载函数作为成员函数,如下面的形式:运算符重载函数作为成员函数,如下面的形式:Complex Complexoperator+(int&i)Complex Complexoperator+(int&i)return Complex(real+i,
17、imag);return Complex(real+i,imag);注意注意在表达式中重载的运算符在表达式中重载的运算符“+”“+”左侧应为左侧应为ComplexComplex类的对象,如:类的对象,如:c3=c2+i;c3=c2+i;不能写成不能写成c3=i+c2;c3=i+c2;/运算符运算符“+”“+”的左侧不是类对象,编译出的左侧不是类对象,编译出错错电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学如果出于某种考虑,要求在使用重载运算符时运算如果出于某种考虑,要求在使用重载运算符
18、时运算符左侧的操作数是整型量(如表达式符左侧的操作数是整型量(如表达式i+c2i+c2,运算符,运算符左侧的操作数左侧的操作数i i是整数),这时是无法利用前面定是整数),这时是无法利用前面定义的重载运算符的,因为无法调用义的重载运算符的,因为无法调用i.operator+i.operator+函函数。可想而知,如果运算符左侧的操作数属于数。可想而知,如果运算符左侧的操作数属于C+C+标准类型标准类型(如如int)int)或是一个其他类的对象,则运算或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能作为非成员函符重载函数不能作为成员函数,只能作为非成员函数。如果函数需要访问类的私有成
19、员,则必须声明数。如果函数需要访问类的私有成员,则必须声明为友元函数。可以在为友元函数。可以在ComplexComplex类中声明:类中声明:电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学friend Complex operator+(int&i,Complex&c);friend Complex operator+(int&i,Complex&c);/在类外定义友元函数:在类外定义友元函数:Complex operator+(int&i,Complex&c)Complex oper
20、ator+(int&i,Complex&c)return Complex(i+c.real,c.imag);return Complex(i+c.real,c.imag);将双目运算符重载为友元函数时,将双目运算符重载为友元函数时,在函数的形参在函数的形参表列中必须有两个参数,不能省略,形参的顺序任表列中必须有两个参数,不能省略,形参的顺序任意,不要求第一个参数必须为类对象。但在使用运意,不要求第一个参数必须为类对象。但在使用运算符的表达式中,要求运算符左侧的操作数与函数算符的表达式中,要求运算符左侧的操作数与函数第一个参数对应,运算符右侧的操作数与函数的第第一个参数对应,运算符右侧的操作数与
21、函数的第二个参数对应。如二个参数对应。如c3=i+c2;c3=i+c2;/正确,类型匹配正确,类型匹配c3=c2+ic3=c2+i;/错误,类型不匹配错误,类型不匹配电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学注意:注意:数学上的交换律在此不适用。如果希望适用数学上的交换律在此不适用。如果希望适用交换律,则应再重载一次运算符交换律,则应再重载一次运算符“+”“+”。如。如Complex operator+(Complex&c,int&i)Complex operator+(Compl
22、ex&c,int&i)/此时第一个参数为类对象此时第一个参数为类对象return Complex(i+c.real,c.imag);return Complex(i+c.real,c.imag);C+C+规定,有的运算符规定,有的运算符(如赋值运算符、下标运算符、如赋值运算符、下标运算符、函数调用运算符函数调用运算符)必须定义为类的成员函数,有的必须定义为类的成员函数,有的运算符则不能定义为类的成员函数运算符则不能定义为类的成员函数(如流插入如流插入“”“”“”、类型转换运算符、类型转换运算符)。电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPAR
23、TMENTC+C+程序设计程序设计 网网 络络 教教 学学由于友元的使用会破坏类的封装,因此从原则上由于友元的使用会破坏类的封装,因此从原则上说,说,一般将单目运算符重载为成员函数,将双目运一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。算符重载为友元函数。说明:说明:有的有的C+C+编译系统编译系统(如如Visual C+6.0)Visual C+6.0)没有没有完全实现完全实现C+C+标准,它所提供不带后缀标准,它所提供不带后缀.h.h的头文件的头文件不支持把成员函数重载为友元函数。但是不支持把成员函数重载为友元函数。但是Visual Visual C+C+所提供的老形式的带后
24、缀所提供的老形式的带后缀.h.h的头文件可以支持的头文件可以支持此项功能,因此可以将程序头两行修改如下,即可此项功能,因此可以将程序头两行修改如下,即可顺利运行:顺利运行:#include#include 以后如遇到类似情况,亦可照此办理。以后如遇到类似情况,亦可照此办理。电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学双目运算符双目运算符(或称二元运算符或称二元运算符)是是C+C+中最常用的运中最常用的运算符。双目运算符有两个操作数,通常在运算符的算符。双目运算符有两个操作数,通常在运
25、算符的左右两侧。左右两侧。例例10.4 10.4 定义一个字符串类定义一个字符串类StringString,用来存放不定长的,用来存放不定长的字符串,重载运算符字符串,重载运算符“=”,“”“=”,“”“”,用于,用于两个字符串的等于、小于和大于的比较运算。两个字符串的等于、小于和大于的比较运算。10.5 10.5 重载双目运算符重载双目运算符电子与信息工程系电子与信息工程系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学编程过程编程过程:(1)先建立一个先建立一个String类:类:#include using na
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算符重载 运算符重载 PPT课件 运算 重载 PPT 课件

限制150内