45954-00郭炜-新标准C程序设计4 运算符重载_第1页
45954-00郭炜-新标准C程序设计4 运算符重载_第2页
45954-00郭炜-新标准C程序设计4 运算符重载_第3页
45954-00郭炜-新标准C程序设计4 运算符重载_第4页
45954-00郭炜-新标准C程序设计4 运算符重载_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计实习,郭炜微博,信息科学技术学院,信息科学技术学院程序设计实习郭炜,运算符重载基本概念,威尼斯,运算符重载的需求,C+预定义的运算符,只能用于基本数据类型的运算:整型、实型、字符型、逻辑型.+、-、*、/、%、Complex(doubler=0.0,doublei=0.0):real(r),imag(i)Complexoperator-(constComplex/返回一个临时对象重载为成员函数时,参数个数为运算符目数减一。重载为普通函数时,参数个数为运算符目数。,intmain()Complexa(4,4),b(1,1),c;c=a+b;/等价于c=operator+(a,b);coutc.real,c.imagendl;cout(a-b).real,(a-b).imagendl;/a-b等价于a.operator-(b)return0;输出:5,53,3c=a+b;等价于c=operator+(a,b);a-b等价于a.operator-(b),信息科学技术学院程序设计实习郭炜,14,如果将运算符重载成一个类的成员函数,则该重载函数有几个参数?0B)1C)2D)3,信息科学技术学院程序设计实习郭炜,15,答案:B,如果将运算符重载成一个类的成员函数,则该重载函数有几个参数?0B)1C)2D)3,信息科学技术学院程序设计实习郭炜,赋值运算符的重载,本溪洋湖沟,有时候希望赋值运算符两边的类型可以不匹配,比如,把一个int类型变量赋值给一个Complex对象,或把一个char*类型的字符串赋值给一个字符串对象,此时就需要重载赋值运算符“=”。赋值运算符“=”只能重载为成员函数,赋值运算符=重载(P210),classStringprivate:char*str;public:String():str(NULL)constchar*c_str()returnstr;String,String:String()if(str)deletestr;intmain()Strings;s=GoodLuck,;/等价于s.operator=(GoodLuck,);couts.c_str()endl;/Strings2=hello!;/这条语句要是不注释掉就会出错s=Shenzhou8!;/等价于s.operator=(Shenzhou8!);couts.c_str()endl;return0;输出:GoodLuck,Shenzhou8!,浅拷贝和深拷贝(P213),classStringprivate:char*str;public:String():str(NULL)constchar*c_str()returnstr;String,StringS1,S2;S1=“this”;S2=“that”;S1=S2;,str,s1,t,h,i,s,0,str,s2,t,h,a,t,0,StringS1,S2;S1=“this”;S2=“that”;,str,s1,t,h,i,s,0,str,s2,t,h,a,t,0,str,s1,t,h,i,s,0,str,s2,t,h,a,t,0,StringS1,S2;S1=“this”;S2=“that”;,S1=S2;,如不定义自己的赋值运算符,那么S1=S2实际上导致S1.str和S2.str指向同一地方。,如不定义自己的赋值运算符,那么S1=S2实际上导致S1.str和S2.str指向同一地方。如果S1对象消亡,析构函数将释放S1.str指向的空间,则S2消亡时还要释放一次,不妥。,如不定义自己的赋值运算符,那么S1=S2实际上导致S1.str和S2.str指向同一地方。如果S1对象消亡,析构函数将释放S1.str指向的空间,则S2消亡时还要释放一次,不妥。另外,如果执行S1=other;会导致S2.str指向的地方被delete因此要在classMyString里添加成员函数:String,如不定义自己的赋值运算符,那么S1=S2实际上导致S1.str和S2.str指向同一地方。如果S1对象消亡,析构函数将释放S1.str指向的空间,则S2消亡时还要释放一次,不妥。另外,如果执行S1=other;会导致S2.str指向的地方被delete因此要在classMyString里添加成员函数:String这么做就够了吗?还有什么需要改进的地方?,考虑下面语句:MyStrings;s=Hello;s=s;是否会有问题?,考虑下面语句:MyStrings;s=Hello;s=s;是否会有问题?,解决办法:String,对operator=返回值类型的讨论void好不好?String好不好?为什么是Stringpublic:Complex(doubler,doublei):real(r),imag(i);Complexoperator+(doubler);ComplexComplex:operator+(doubler)/能解释c+5returnComplex(real+r,imag);,运算符重载为友元函数(P215),经过上述重载后:Complexc;c=c+5;/有定义,相当于c=c.operator+(5);但是:c=5+c;/编译出错所以,为了使得上述的表达式能成立,需要将+重载为普通函数。Complexoperator+(doubler,constComplex,运算符重载为友元函数(P215),但是普通函数又不能访问私有成员,所以,需要将运算符+重载为友元。classComplexdoublereal,imag;public:Complex(doubler,doublei):real(r),imag(i);Complexoperator+(doubler);friendComplexoperator+(doubler,constComplex,运算符重载实例:可变长整型数组(教材P215),信息科学技术学院程序设计实习郭炜,美国拱门国家公园,intmain()/要编写可变长整型数组类,使之能如下使用:CArraya;/开始里的数组是空的for(inti=0;i5;+i)a.push_back(i);CArraya2,a3;a2=a;for(inti=0;ia.length();+i)couta2i;a2=a3;/a2是空的for(inti=0;ia2.length();+i)/a2.length()返回0couta2i;coutendl;a3=100;CArraya4(a);for(inti=0;ia4.length();+i)couta4i;return0;,程序输出结果是:012340121004要做哪些事情?,40,intmain()/要编写可变长整型数组类,使之能如下使用:CArraya;/开始里的数组是空的for(inti=0;i5;+i)a.push_back(i);CArraya2,a3;a2=a;for(inti=0;ia.length();+i)couta2i;a2=a3;/a2是空的for(inti=0;ia2.length();+i)/a2.length()返回0couta2i;coutendl;a3=100;CArraya4(a);for(inti=0;ia4.length();+i)couta4i;return0;,程序输出结果是:012340121004要做哪些事情?,要用动态分配的内存来存放数组元素,需要一个指针成员变量,41,intmain()/要编写可变长整型数组类,使之能如下使用:CArraya;/开始里的数组是空的for(inti=0;i5;+i)a.push_back(i);CArraya2,a3;a2=a;for(inti=0;ia.length();+i)couta2i;a2=a3;/a2是空的for(inti=0;ia2.length();+i)/a2.length()返回0couta2i;coutendl;a3=100;CArraya4(a);for(inti=0;ia4.length();+i)couta4i;return0;,程序输出结果是:012340121004要做哪些事情?,要重载“=”,要用动态分配的内存来存放数组元素,需要一个指针成员变量,42,intmain()/要编写可变长整型数组类,使之能如下使用:CArraya;/开始里的数组是空的for(inti=0;i5;+i)a.push_back(i);CArraya2,a3;a2=a;for(inti=0;ia.length();+i)couta2i;a2=a3;/a2是空的for(inti=0;ia2.length();+i)/a2.length()返回0couta2i;coutendl;a3=100;CArraya4(a);for(inti=0;ia4.length();+i)couta4i;return0;,程序输出结果是:012340121004要做哪些事情?,要重载“=”,要用动态分配的内存来存放数组元素,需要一个指针成员变量,要重载“”,43,intmain()/要编写可变长整型数组类,使之能如下使用:CArraya;/开始里的数组是空的for(inti=0;i5;+i)a.push_back(i);CArraya2,a3;a2=a;for(inti=0;ia.length();+i)couta2i;a2=a3;/a2是空的for(inti=0;ia2.length();+i)/a2.length()返回0couta2i;coutendl;a3=100;CArraya4(a);for(inti=0;ia4.length();+i)couta4i;return0;,程序输出结果是:012340121004要做哪些事情?,要重载“=”,要用动态分配的内存来存放数组元素,需要一个指针成员变量,要重载“”,要自己写复制构造函数,44,classCArrayintsize;/数组元素的个数int*ptr;/指向动态分配的数组public:CArray(ints=0);/s代表数组元素的个数CArray(CArray,45,classCArrayintsize;/数组元素的个数int*ptr;/指向动态分配的数组public:CArray(ints=0);/s代表数组元素的个数CArray(CArray,46,CArray:CArray(ints):size(s)if(s=0)ptr=NULL;elseptr=newints;CArray:CArray(CArray,47,ptr,a1,CArraya2(a1);,ptr,a2,ptr,a1,11,14,9,8,11,14,9,8,ptr,ptr,a1,11,14,9,8,11,14,9,8,a2,CArray:CArray()if(ptr)deleteptr;CArray,49,if(sizea.size)/如果原有空间够大,就不用分配新的空间if(ptr)deleteptr;ptr=newinta.size;memcpy(ptr,a.ptr,sizeof(int)*a.size);size=a.size;return*this;/CArray/重新分配空间memcpy(tmpPtr,ptr,sizeof(int)*size);/拷贝原数组内容deleteptr;ptr=tmpPtr;else/数组本来是空的ptr=newint1;ptrsize+=v;/加入新的数组元素,51,信息科学技术学院程序设计实习郭炜,52,在本例的可变长数组类中,重载了哪些运算符或编写了哪些成员函数?=,+=,复制构造函数=,+,复制构造函数=,为什么能够成立?cout是什么?“”为什么能用在cout上?,问题,cout是在iostream中定义的,ostream类的对象。“”能用在cout上是因为,在iostream里对“”进行了重载。考虑,怎么重载才能使得cout5;和cout“this”都能成立?,流插入运算符的重载,流插入运算符的重载,有可能按以下方式重载成ostream类的成员函数:voidostream:operator(intn)/输出n的代码return;,流插入运算符的重载,cout5;即cout.operator(5);cout“this”;即cout.operator(“this”);怎么重载才能使得cout5“this”;成立?,流插入运算符的重载,ostream,流插入运算符的重载,cout5“this”;本质上的函数调用的形式是什么?,cout.operator(5).operator(“this”);,流插入运算符的重载,假定下面程序输出为5hello,该补写些什么classCStudentpublic:intnAge;intmain()CStudents;s.nAge=5;coutscn;coutc,cn;coutc,n;return0;运行结果可以如下:13.2+133i8713.2+133i,87,信息科学技术学院程序设计实习郭炜,68,重载“”用于将自定义的对象通过cout输出时,以下说法哪个是正确的?可以将重载为ostream类的成员函数,返回值类型是ostreamclassComplexdoublereal,imag;public:Complex(doubler=0,doublei=0):real(r),ima

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论