第10章运算符重载new(精品).ppt
《第10章运算符重载new(精品).ppt》由会员分享,可在线阅读,更多相关《第10章运算符重载new(精品).ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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+程序设计程序设计 网网 络络 教教 学学10.1 什么是运算符重载什么是运算符重载运算符重载的实质运算符重载的实质u运算符重载是对已有的运算符赋予多重含义运算符重载是对已有的运算符赋予多重含义u必要性必要性u实现机制实现机制lC+中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)l将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。l编译系
3、统对重载运算符的选择,遵循函数重载的选择原则。计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例:用“+”号进行两个复数的相加。在C+中不能在程序中直接用运算符“+”对复数进行相加运算。用户必须自己设法实现复数相加。计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例10.1 通过函数来实现复数相加。#include using namespace std;class Com
4、plexpublic:Complex()real=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 Complexcomplex_add(Complex&c2)Complex c;c.real=real+c2.real;计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程
5、序设计程序设计 网网 络络 教教 学学 c.imag=imag+c2.imag;return c;void Complexdisplay()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=plex_add(c2);/调用复数相加函数 coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();return 0;运行结果如下:运行结果如下:c1=(3+4i)c2=(5-10i)c1+c2=(8,-6i)能否直接用加号能否直接用加号“+”来实来实现复
6、数运算呢?如现复数运算呢?如:c3=c1+c2;计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学l声明形式声明形式函数类型函数类型 operator operator 运算符(形参)运算符(形参).l重载为类成员函数时重载为类成员函数时 参数个数参数个数=原操作数个数原操作数个数-1(后置(后置+、-除外)除外)l重载为友元函数时重载为友元函数时 参数个数参数个数=原操作数个数原操作数个数,且,且 至少应该有一个自定义类型的形参。至少应该有一个自定义类型的形参。10.2 10.2 运
7、算符重载的方法运算符重载的方法计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例如,想将“+”用于Complex类(复数)的加法运算,函数的原型为:Complex operator+(Complex&c1,Complex&c2);在定义了重载运算符的函数后,可以说:函数函数operator+重重载了运算符载了运算符+。为了说明在运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想像为调用下面的函数:int operator+(int a,int b)return(a+b
8、);如果有表达式5+8,就调用此函数,将5和8作为调用函数时的实参,函数的返回值为13。这就是用函数的方法理解运算符。计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例10.2 改写例10.1,重载运算符“+”,使之能用于两个复数相加。#include using namespace std;class Complexpublic:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex operat
9、or+(Complex&c2);/声明重载运算符的函数 void display();private:double real;double imag;operator+取代了 complex_add计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学Complex Complexoperator+(Complex&c2)Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c;void Complexdisplay()cout(
10、real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;/运算符+用于复数运算 coutc1=;c1.display();coutc2=;c2.display();coutreal+c2.real,this-real就是c1.real。10.4 10.4 运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学u类的友元函数重载例10.3#inc
11、lude using namespace std;class Complexpublic:Complex()real=0;imag=0;Complex(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+
12、(Complex&c1,Complex&c2)/定义友元函数的重载函数在类外访问私有成员return Complex(c1.real+c2.real,c1.imag+c2.imag);void Complexdisplay()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&T
13、ECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学那种情况下选择运算符重载函数为类的成员函数、类的友元函数和普通函数:普通函数不能直接访问类的私有成员,极少选用。如果将运算符重载函数作为成员函数,它可以通过this指针自由地访问本类的数据成员,可以少写一个函数的参数。但必须要求运算表达式第一个参数(即运算符左侧的操作数)是一个类对象。左侧的操作数是标准类型就要使用友元函数(访问私有成员)计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例如:将一个
14、复数和一个整数相加,如c1+i,可以将运算符重载函数作为成员函数,如下面的形式:Complex Complexoperator+(int&i)return Complex(real+i,imag);注意在表达式中重载的运算符“+”左侧应为Complex类的对象,如:c3=c2+i;不能写成c3=i+c2;/运算符“+”的左侧不是类对象,编译出错,这时应使用友元函数重载计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是整型量(如
15、表达式i+c2,运算符左侧的操作数i是整数),这时是无法利用前面定义的重载运算符的,因为无法调用i.operator+函数。可想而知,如果运算符左侧的操作数属于C+标准类型(如int)或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能作为非成员函数。如果函数需要访问类的私有成员,则必须声明为友元函数。可以在Complex类中声明:计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学class Complexpublic:friend Complex operator+(int&
16、i,Complex&c);.;Complex operator+(int&i,Complex&c)return Complex(i+c.real,c.imag);将双目运算符重载为友元函数时,在函数的形参表列中必须有两个参数,不能省略,形参的顺序任意,不要求第一个参数必须为类对象。但在使用运算符的表达式中,要求运算符左侧的操作数与函数第一个参数对应,运算符右侧的操作数与函数的第二个参数对应。如c3=i+c2;/正确,类型匹配c3=c2+i;/错误,类型不匹配计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计
17、网网 络络 教教 学学注意:注意:数学上的交换律在此不适用。如果希望适用交换律,则应再重载一次运算符“+”。如Complex operator+(Complex&c,int&i)/第一个参数为类对象return Complex(i+c.real,c.imag);C+规定,有的运算符(如赋值运算符、下标运算符、函数调用运算符)必须定义为类的成员函数,有的运算符则不能定义为类的成员函数(如流插入“”、类型转换运算符)。计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学由于友元的使用会破坏类
18、的封装,因此从原则上说,一般将单目运算符重载为成员函数单目运算符重载为成员函数,将双目运算符重载为友元双目运算符重载为友元函数。函数。说明:有的C+编译系统(如Visual C+6.0)没有完全实现C+标准,它所提供不带后缀.h的头文件不支持把成员函数重载为友元函数。但是Visual C+所提供的老形式的带后缀.h的头文件可以支持此项功能,因此可以将程序头两行修改如下,即可顺利运行:#include#include using namespace std;计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网
19、网 络络 教教 学学双目运算符(或称二元运算符)是C+中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧,如3+5,a=b,i10等。在重载双目运算符时,在函数中应该有两个参数。例10.4 定义一个字符串类String,用来存放不定长的字符串,重载运算符“=”,“”,用于两个字符串的等于、小于和大于的比较运算。10.5 10.5 重载双目运算符重载双目运算符计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学编程过程:(1)先建立一个String类:#include usi
20、ng namespace std;class Stringpublic:String()p=NULL;/默认构造函数 String(char*str);/构造函数 void display();private:char*p;/字符型指针,用于指向字符串;计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学StringString(char*str)/定义构造函数p=str;/使p指向实参字符串void Stringdisplay()/输出p所指向的字符串coutp;int main()S
21、tring string1(“Hello”),string2(“Book”);string1.display();cout”重载的部分。程序如下:#include#include using namespace std;class Stringpublic:String()p=NULL;String(char*str);friend bool operator(String&string1,String&string2);void display();private:char*p;/字符型指针,用于指向字符串;StringString(char*str)p=str;计算机科学与技术系计算机科学
22、与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学void Stringdisplay()/输出p所指向的字符串cout(String&string1,String&string2)/运算符重载函数if(strcmp(string1.p,string2.p)0)return true;else return false;int main()String string1(Hello),string2(Book);coutstring2)(String&string1,String&string2);friend b
23、ool operator(String&string1,String&string2)if(strcmp(string1.p,string2.p)0)return true;else return false;bool operator(String&string1,String&string2)if(strcmp(string1.p,string2.p)0)return true;else return false;计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学bool oper
24、ator=(String&string1,String&string2)if(strcmp(string1.p,string2.p)=0)return true;elsereturn false;int main()String string1(Hello),string2(Book),string3(Computer);coutstring2)endl;/比较结果应该为truecout(string1string3)endl;/比较结果应该为false cout(string1=string2)endl;/比较结果应该为false return 0;运行结果为:100计算机科学与技术系计算机
25、科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学(4)再进一步修饰完善,下面给出最后的程序。#include using namespace std;class Stringpublic:String()p=NULL;String(char*str);friend bool operator(String&string1,String&string2);friend bool operator(String&string1,String&string2);friend bool operator=(Stri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 运算 重载 new 精品
限制150内