第10章运算符重载new(精品).ppt

上传人:hyn****60 文档编号:71503596 上传时间:2023-02-03 格式:PPT 页数:66 大小:464KB
返回 下载 相关 举报
第10章运算符重载new(精品).ppt_第1页
第1页 / 共66页
第10章运算符重载new(精品).ppt_第2页
第2页 / 共66页
点击查看更多>>
资源描述

《第10章运算符重载new(精品).ppt》由会员分享,可在线阅读,更多相关《第10章运算符重载new(精品).ppt(66页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

26、ng&string1,String&string2);void display();private:char*p;计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学StringString(char*str)p=str;void Stringdisplay()/输出p所指向的字符串cout(String&string1,String&string2)if(strcmp(string1.p,string2.p)0)return true;elsereturn false;bool ope

27、rator(String&string1,String&string2)计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学if(strcmp(string1.p,string2.p)(string1,string2)=1)string1.display();cout;string2.display();else if(operator(string1,string2)=1)string1.display();cout;string2.display();计算机科学与技术系计算机科学与技

28、术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学else if(operator=(string1,string2)=1)string1.display();cout=;string2.display();coutBookBookComputerHello=Hello计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学增加了一个compare函数,用来对两个字符串进行比较,并输出相应的信息。这样可以减轻主函数

29、的负担,使主函数简明易读。编写C+程序的指导思想:先搭框架,逐步扩充,由简到繁,最后完善。边编程,边调试,边扩充。千万不要企图在一开始时就解决所有的细节。类是可扩充的,可以一步一步地扩充它的功能。最好直接在计算机上写程序,每一步都要上机调试,调试通过了前面一步再做下一步,步步为营。这样编程和调试的效率是比较高的。计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学单目运算符只有一个操作数,如!a,-b,&c,*p,还有最常用的+i和-i等。重载单目运算符的方法与重载双目运算符的方法是类似

30、的。但由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。下面以自增运算符“+”为例,介绍单目运算符的重载。10.6 10.6 重载单目运算符重载单目运算符计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例10.5 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0开始算。要求输出分和秒的值。#include using namespace std;class

31、 Timepublic:Time()minute=0;sec=0;/默认构造函数 Time(int m,int s):minute(m),sec(s)/构造函数重载 Time operator+();/声明运算符重载函数 void display()coutminute:sec=60)sec-=60;/满60秒进1分钟+minute;return*this;/返回当前对象值 int main()Time time1(34,0);for(int i=0;i61;i+)+time1;time1.display();return 0;运行情况如下:34:134:234:5935:035:1 (共输出

32、61行)计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学“+”+”和和“-”-”运算符有两种使用方式运算符有两种使用方式:u前置自增运算符前置自增运算符u后置自增运算符后置自增运算符:C+C+约定:增加一个约定:增加一个intint型形参。型形参。例10.6 在上例基础上增加对后置自增运算符的重载。修改后的程序如下:#include using namespace std;class Timepublic:Time()minute=0;sec=0;Time(int m,int s):

33、minute(m),sec(s)计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学Time operator+();/声明前置自增运算符“+”重载函数Time operator+(int);/声明后置自增运算符“+”重载函数void display()coutminute:sec=60)sec-=60;+minute;return*this;Time Timeoperator+(int)Time temp(*this);/保存当前对象值sec+;计算机科学与技术系计算机科学与技术系CO

34、MPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学if(sec=60)sec-=60;+minute;return temp;/返回的是自加前的对象int main()Time time1(34,59),time2;cout time1:;time1.display();+time1;cout+time1:;time1.display();time2=time1+;/将自加前的对象的值赋给time2 couttime1+:;time1.display();cout time2:;time2.display();/输出time

35、2对象的值运行结果如下:time1:34:59 +time1:35:0time1+:35:1 time2:35:0计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学10.7 10.7 重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符istream 类的对象cin;ostream类的对象cout;流插入运算符“”凡是用“cout”对标准类型数据进行输入输出的,都要用#include 把头文件包含到本程序文件中。计算机科学与技术系计算机科学与技术系COMPUTER SCIENC

36、E&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学如果想直接用如果想直接用“”输出和输入自己声明输出和输入自己声明的类型的数据,必须对它们重载。的类型的数据,必须对它们重载。对“”重载的函数形式如下:istream&operator (istream&,自定义类自定义类&);ostream&operator”的函数的第一个参数和函数的类型都必的函数的第一个参数和函数的类型都必须是须是istreamistream&类型,第二个参数是要进行输入操作的类。类型,第二个参数是要进行输入操作的类。重载重载“”和和“”的函数作为的函数作为友元友元函数或函数或普通

37、普通的函数,而不能将它们定义为成员函数。的函数,而不能将它们定义为成员函数。计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例10.7:用重载“”输出复数。#include using namespace std;class Complexpublic:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex operator+(Complex&c2);/运算符“+”重载为成员函数friend ost

38、ream&operator (ostream&,Complex&);/运算符“”重载为友元函数private:10.7.1 10.7.1 重载流插入运算符重载流插入运算符“”计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学double real;double imag;Complex Complexoperator+(Complex&c2)return Complex(real+c2.real,imag+c2.imag);ostream&operator (ostream&outpu

39、t,Complex&c)output(c.real+c.imagi)endl;return output;/连续向输出流插入信息int main()Complex c1(2,4),c2(6,10),c3;c3=c1+c2;coutc3;return 0;coutc3解释为:operator(cout,c3)计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学运行结果为:(8+14i)连续向输出流插入信息:coutc3c2;先处理coutc3,即:(coutc3)c2;而执行(coutc3

40、)得到的结果就是具有新内容的流对象cout,因此,(coutc3)c2相当于cout(新值)c2。运算符“”左侧是ostream类对象cout,右侧是Complex类对象c2,则再次调用运算符“”重载函数,接着向输出流插入c2的数据。现在可以理解了为什么C+规定运算符“”重载函数的第一个参数和函数的类型都必须是ostream类型的引用,就是为了返回cout的当前值以便连续输出。计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学注意:l区分什么情况下的“”是标准类型数据的流插入符,什么情

41、况下的“”是重载的流插入符。如:coutc35endl;l在Complex类中定义了运算符“”重载函数为友元函数,因此只有在输出Complex类对象时才能使用重载的运算符,对其他类型的对象是无效的。如cout”的作用是从一个输入流中提取数据,如“cini;”表示从输入流中提取一个整数赋给变量i(假设已定义i为int型)。重载流提取运算符的目的是希望将“”用于输入自定义类型的对象的信息。10.7.2 10.7.2 重载流提取运算符重载流提取运算符“”计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络

42、 教教 学学例10.8 在例10.7的基础上,增加重载流提取运算符“”,用“cin”输入复数,用“cout”输出复数。#include using namespace std;class Complexpublic:friend ostream&operator (istream&,Complex&);private:double real;double imag;ostream&operator (ostream&output,Complex&c)output(c.real+c.imag(istream&input,Complex&c)coutc.realc.imag;return inpu

43、t;int main()Complex c1,c2;cinc1c2;coutc1=c1endl;coutc2=c2endl;return 0;运行情况如下:input real part and imaginary part of complex number:3 6input real part and imaginary part of complex number:4 10c1=(3+6i)c2=(4+10i)直接输入复数对象计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学虚部

44、如果是负数,就不理想,请观察输出结果。input real part and imaginary part of complex number:3 6input real part and imaginary part of complex number:4-10c1=(3+6i)c2=(4+-10i)将重载运算符“”函数修改如下:ostream&operator (ostream&output,Complex&c)output(=0)output+;/虚部为正数,在前加“+”号 outputc.imagi)endl;/虚部为负数,不加“+”号 return output;这样,运行时输出的最

45、后一行为c2=(4-10i)。计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学运算符重载中使用引用的重要性:利用引用作为函数的形参可以在调用函数的过程中通过传址方式使形参成为实参的别名,因此不生成临时变量(实参的副本),减少了时间和空间的开销如果重载函数的返回值是对象的引用时,返回的不是常量,而是引用所代表的对象,它可以出现在赋值号的左侧而成为左值,可以被赋值或参与其他操作(如保留cout流的当前值以便能连续使用“”输出)。使用引用时要特别小心,因为修改了引用就等于修改了它所代表的对

46、象。计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学 隐式类型转换隐式类型转换 显式类型转换显式类型转换在C+中,某些不同类型数据之间可以自动转换,例如:int i=6;i=7.5+i;int double double这种转换是由C+编译系统自动完成的,用户不需干预。这种转换称为隐式类型转换。10.8 10.8 不同类型数据间的转换不同类型数据间的转换 10.8.1 10.8.1 标准类型数据间的转换标准类型数据间的转换计算机科学与技术系计算机科学与技术系COMPUTER SCIE

47、NCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学C+还提供显式类型转换,程序人员在程序中指定将一种指定的数据转换成另一指定的类型,其形式为 类型名类型名(数据数据)如:int(89.5);其作用是将89.5转换为整型数89。对于用户自己声明的类型,编译系统并不知道怎样进行转换。解决这个问题的关键是让编译系统知道怎样去进行这些转换,需要定义专门的函数来处理。计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学转换构造函数(conversio

48、n constructor function)的作用是将一个其他类型的数据转换成一个类的对象。先回顾一下以前学习过的几种构造函数:默认构造函数。以Complex类为例,函数原型的形式为:Complex();/没有参数用于初始化的构造函数。函数原型的形式为:Complex(double r,double i);/形参表列中一般有两个以上参数用于复制对象的复制构造函数。函数原型的形式为:10.8.2 10.8.2 转换构造函数转换构造函数计算机科学与技术系计算机科学与技术系COMPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学C

49、omplex(Complex&c);/形参是本类对象的引用现在又要介绍一种新的构造函数转换构造函数。转换构造函数只有一个形参,如 Complex(double r)real=r;imag=0;其作用是将double型的参数r转换成Complex类的对象,将r作为复数的实部,虚部为0。用户可以根据需要定义转换构造函数,在函数体中告诉编译系统怎样去进行转换。在类体中,可以有转换构造函数,也可以没有转换构造函数,视需要而定。以上几种构造函数可以同时出现在同一个类中,它们是构造函数的重载。编译系统会根据建立对象时给出的实参的个数与类型选择形参与之匹配的构造函数。计算机科学与技术系计算机科学与技术系CO

50、MPUTER SCIENCE&TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学使用转换构造函数将一个指定的数据转换为类对象的方法如下:先声明一个类。先声明一个类。在这个类中定义一个只有一个参数的构造函数,在这个类中定义一个只有一个参数的构造函数,参数的类型是需要转换的类型,在函数体中指定转参数的类型是需要转换的类型,在函数体中指定转换的方法。换的方法。在该类的作用域内可以用以下形式进行类型转在该类的作用域内可以用以下形式进行类型转换:类名换:类名(指定类型的数据指定类型的数据)就可以将指定类型的数据转换为此类的对象。计算机科学与技术系计算机科学与技术系

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

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁